我想实现二叉树,使其不包含重复项。这是我的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次。
答案 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变量作为根。