创建二叉树(但不是BST)

时间:2014-05-21 06:09:25

标签: algorithm data-structures tree binary-tree

当我创建BST时,在插入节点期间,我会检查新节点的值是小于左子节点还是大于右子节点。我向下走,直到找到插入节点的正确位置。现在假设我有一个二叉树,我想创建一个树,我该怎么做?我是否需要使用BFS算法来做到这一点?

谢谢

2 个答案:

答案 0 :(得分:3)

这不是插入应该如何在BST中起作用, 新值应该与当前节点进行比较而不是它的子节点,如果它小于当前节点遍历的值,如果有一个左节点将值与它进行比较,如果没有左节点存在则在那里插入值。右侧也是如此,但如果比较结果大于当前节点(BST中没有重复值)。

您的问题是关于如何创建二进制树而不是BST, 如果你想要一个构造完整二叉树的简单二叉树,那么只需从左到右逐层插入节点。当然BFS是逐层工作的,但它是一种搜索算法,因为你是从头开始构建它所以不需要搜索树。

修改: 如果你想要一个更简单的二叉树构造版本,只需在一个分支中一直向下插入2个节点而不需要回溯,即使你也插入了1个节点,它仍然是一个二叉树。

Enother Edit : 每个 BST 都是二叉树,每个二叉树都是 并且这个论点不能被反转(例如,不是每个BT都是BST ......等等)。所以,如果你有BT,它已经是一棵树。

此致

答案 1 :(得分:1)

在这里,我制作一个基于权重的二叉树,这对BFS有好处,因为它可以保持树的平衡。

我在Java

中实现了这一点
class BT_Node
{
    public int value;
    public int depth;
    public long weight;
    public BT_Node left, right;

    public BT_Node (int value, int depth)
    {
        this.depth = depth;
        this.value = value;
        this.weight = 0;
        this.left = this.right = null;
    }
}

class BT
{
    private BT_Node root;

    public long size ()
    {
        return (root!=null ? root.weight : 0);
    }

    public long size (BT_Node node)
    {
        return (node!=null ? node.weight : 0);
    }

    public void insert (int value)
    {
        int depth = 0;
        BT_Node parent = root;

        if (root == null)
        {
            root = new BT_Node (value, 0);
        }
        else
        {
            root.weight++;

            while (parent.left!=null && parent.right!=null)
            {
                if (parent.left.weight <= parent.right.weight)
                    parent=parent.left;
                else
                    parent=parent.right;

                parent.weight++;
            }

            if (parent.left == null)
                parent.left = new BT_Node (value, parent.depth+1);
            else
                parent.right = new BT_Node (value, parent.depth+1);
        }
    }
}