【问题标题】:How to create a Binary Tree from a General Tree?如何从通用树创建二叉树?
【发布时间】:2023-03-25 05:53:01
【问题描述】:

我必须为 java 中的 BinaryTree 类解决以下构造函数:

BinaryTree(GeneralTree<T> aTree)

此方法应从 General Tree (gt) 创建一个 BinaryTree (bt),如下所示:

gt 中的每个顶点都将表示为 bt 中的叶子。

  • 如果 gt 是叶子,那么 bt 将是与 gt 具有相同值的叶子
  • 如果 gt 不是叶,则 bt 将被构造为一个空根、一个左子树 (lt) 和一个右子树 (lr)。 Lt 是从 gt 的最旧子树(最左子树)创建的严格二叉树,lr 是从 gt 创建的不带最左子树的严格二叉树。

第一部分很琐碎,但第二部分给我带来了一些麻烦。我已经走到这一步了:

public BinaryTree(GeneralTree<T> aTree){
        if (aTree.isLeaf()){
            root= new BinaryNode<T>(aTree.getRootData());
        }else{
            root= new BinaryNode<T>(null); // empty root
            LinkedList<GeneralTree<T>> childs = aTree.getChilds(); // Childs of the GT are implemented as a LinkedList of SubTrees
            child.begin(); //start iteration trough list
            BinaryTree<T> lt = new BinaryTree<T>(childs.element(0)); // first element = left-most child
            this.addLeftChild(lt);
            aTree.DeleteChild(hijos.elemento(0));
            BinaryTree<T> lr = new BinaryTree<T>(aTree);
            this.addRightChild(lr);
        }
    }

这是正确的方法吗?如果没有,你能想出更好的方法来解决这个问题吗?例如,这个解决方案给了我一堆根本没有数据的节点,我不知道这是问题本身的问题还是我的问题。

谢谢!

【问题讨论】:

  • 你能详细说明“给我一些麻烦”的意思吗?
  • 嗨,马特,感谢您的回答。 “给我一些麻烦”可能不是最好的表达方式,也许吧?我只是说我不确定这是否是解决问题的最佳方法。这是我找到的最好的方法,但它有一些问题,例如二叉树可能会在没有数据的节点上出现一堆,我认为这可能不是那么好?
  • GeneralTree 中的节点是否允许有两个以上的子节点?如果是这样,你如何在你的 b-tree 中处理这个?
  • GeneralTree 中的节点理论上可以有任意数量的子节点。这个想法是这样的:我得到了 GT 的 Childs(一个链表)我得到了第一个(最左边的孩子)并用它创建了一个新的 BinaryTree()。然后我从树中删除那个孩子,并用树的其余部分创建一个新的 BinaryTree()。从理论上讲,它应该处理每个孩子,除非我遗漏了什么,这是可能的。再次感谢。

标签: java constructor tree binary-tree


【解决方案1】:

问题是大多数树不能有效地简化为二叉树。 阅读您的评论,您完全了解这一点。 以一棵树的根节点和 3 个孩子为例。在不牺牲连通性的情况下,没有直接的方法可以从中制作二叉树。这就是那些空节点的来源。有了它们,通用树的结构得以保留。您可以重建它,删除空节点并从两个子树中重新组装树。

我还没有调试过你的代码。如果它按照您所说的那样做,这是一个很好的解决方案。空节点存储通用树的连接信息。他们被允许在那里。

【讨论】:

  • 感谢您的回复!将空节点视为保留通用树结构的一种方式确实很有意义。
【解决方案2】:

还有另一种广为人知的从普通树生成二叉树的方法,没有“连接节点”。 这个方法最好这样理解:

Node{                Node{
 data;                data;
 first_child;   =>    left;
 next_sibling;        right; 
}                    }

这基本上将通用树的子节点列表表示为一个链表,每个节点都具有对其子节点的链表的引用。如您所见,这在结构上等价于二叉树。

所以,在伪代码中(为简单起见省略了边缘情况)

BinaryTree(gtree){
    root=BinaryNode(gtree.data,BinaryNode(gtree.children),null);
}

BinaryNode(List<gnode> sibs){
    BinaryNode(sibs.first.data,BinaryNode(sibs.first.children),BinaryTree(sibs.rest));
}

BinaryNode(data,left,right){
    data=data;
    left=left;
    right=right;
}

当然,如果您需要拥有您描述的结构,这将是无用的,但总的来说,这是从一般树创建二叉树的相当好的方法。

【讨论】:

  • 感谢您的回答,米滕!实际上我确实需要你有我描述的结构,但这是从 GT 到 BT 的好方法,我会记住的。
猜你喜欢
  • 2010-10-24
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多