我必须在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);
}
}
这是正确的方法吗?如果没有,你能想出更好的解决方法吗?例如,这个解决方案给了我一堆没有数据的节点,我不知道这是问题本身还是我的问题。
谢谢!
答案 0 :(得分:2)
问题是大多数树无法有效地缩减为二叉树。 阅读你的评论你完全清楚这一点。 以例如具有3个子节点的根节点的树为例。在不牺牲连接性的情况下,没有直接的方法可以从中创建二叉树。这就是那些空节点的来源。通过它们,可以保留一般树的结构。您可以重建它,删除空节点并从两个子树重新组装树。
我没有调试你的代码。如果它按照你所说的那样做,那就是一个很好的解决方案。空节点排序存储一般树的连接信息。他们被允许在那里。
答案 1 :(得分:1)
另一种众所周知的方法是从一般树中创建二叉树,没有“连接节点”。 这种方法可以这样理解:
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;
}
当然,如果你需要拥有你描述的结构,这将是无用的,但一般来说,这是从一般树创建二叉树的一种相当好的方法。