[英]How to create a Binary Tree from a General Tree?
我必须在java中为BinaryTree类解决以下构造函数:
BinaryTree(GeneralTree<T> aTree)
此方法应从常规树(gt)创建BinaryTree(bt ) ,如下所示:
来自gt的每个顶点都将表示为bt中的叶子。
第一部分是微不足道的,但第二部分给了我一些麻烦。 我到目前为止:
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);
}
}
这是正确的方法吗? 如果没有,你能想出更好的解决方法吗? 例如,这个解决方案给了我一堆没有数据的节点,我不知道这是问题本身还是我的问题。
谢谢!
问题是大多数树无法有效地简化为二叉树。 阅读你的评论你完全清楚这一点。 以例如具有3个子节点的根节点的树为例。 在不牺牲连接性的情况下,没有直接的方法可以从中创建二叉树。 这就是那些空节点的来源。 通过它们,可以保留一般树的结构。 您可以重建它,删除空节点并从两个子树重新组装树。
我没有调试你的代码。 如果它按照你所说的那样做,那就是一个很好的解决方案。 空节点排序存储一般树的连接信息。 他们被允许在那里。
另一种众所周知的方法是从一般树中生成二叉树,没有“连接节点”。 这种方法可以这样理解:
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;
}
当然,如果你需要拥有你描述的结构,这将是无用的,但一般来说,这是从一般树创建二叉树的一种相当好的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.