如何从常规树创建二叉树?

时间:2010-06-10 16:10:26

标签: java constructor tree binary-tree

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

BinaryTree(GeneralTree<T> aTree)

此方法应从常规树(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);
        }
    }

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

谢谢!

2 个答案:

答案 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;
}

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