繁体   English   中英

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

[英]How to create a Binary Tree from a General 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);
        }
    }

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

谢谢!

问题是大多数树无法有效地简化为二叉树。 阅读你的评论你完全清楚这一点。 以例如具有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM