重复在二叉搜索树上打印

时间:2014-05-25 02:37:52

标签: java data-structures binary-tree

我想实现二叉树,使其不包含重复项。这是我的insert()方法。

public  BinaryNode insert(BinaryNode node, int x) {

    if (node == null) {
        node = new BinaryNode(x);
    } else if (x < node.element) {
        node.left = insert(node.left, x);
    } else if (node.element < x) {
        node.right = insert(node.right, x);
    } else {
        System.out.println("Duplicates not allowed");
        return null;
    }

    return node;
}


public static void main (String args[]) {
    BinaryTree t = new BinaryTree();
    t.root=t.insert(t.root, 5);
    t.insert(t.root, 6);
    t.insert(t.root, 4);
    t.insert(t.root, 60);
    t.insert(t.root, 25);
    t.insert(t.root, 10);
    t.insert(t.root, 10);

为什么副本10会在此二叉树中打印出来。我认为在发现重复时,else语句中的return null会停止递归。当再次插入10时,它打印出“不允许重复”,但没有从那里停止,它继续添加10次。

2 个答案:

答案 0 :(得分:1)

<强>解决方案:

从原始代码中删除行return null;。这是您应该留下的代码:

public BinaryNode insert(BinaryNode node, int x) {

    if (node == null) {
        node = new BinaryNode(x);
    } else if (x < node.element) {
        node.left = insert(node.left, x);
    } else if (node.element < x) {
        node.right = insert(node.right, x);
    } else {
        System.out.println("Duplicates not allowed");
    }

    return node;
}

<强>解释

当您添加了所有节点后,您的树看起来像这样:

        5
    4       6
                60
            25
        10

您的代码存在的一个问题是,当面临重复时,您将返回null。此代码(从节点25调用)

node.left = insert(node.left, x);

然后得到这个

node.left = null;

换句话说;当您为重复项返回null时,将擦除现有节点。据我所知,新的插入没有。因此,在重复的情况下,您最终会删除现有节点。但是,它将打印&#34;不允许重复&#34;。

如果你删除return null;,现有的10节点将保持不变。而新的10将被忽略。

答案 1 :(得分:0)

据我所知,另一篇文章是正确的,但我建议进行一些修改。

首先 - 这一行

t.root=t.insert(t.root,5);

应该只是

t.insert(5);

在递归插入的第一次迭代中,空树将为null。你的构造函数应该只是

BinaryTree t = new BinaryTree();

并且您的BinaryTree类应该有一个成员Node变量作为根。