我有一棵二叉树,我试图添加元素
问题是如果我有,并且在树中输入5 5 6 6 9 0 0 2 -1
仅添加5 6 9 0 2
(我使用-1来停止添加元素)
我尝试更改if(nodeToAdd.data < node.data)
中的条件if(nodeToAdd.data <= node.data)
,但这没有帮助,我尝试了不同的条件,但没有,每次我都有堆栈溢出。
我需要更改什么才能添加相同数字的两倍,三倍或者n倍?有什么想法吗?
解决了问题,现在一切都运转良好了)
private Node traverseAndAddNode (Node node, int data){
if(node==null)return new Node(data);
if(data <= node.data){
node.leftChild=traverseAndAddNode(node.leftChild, data);
}else if(data > node.data){
node.rightChild=traverseAndAddNode(node.rightChild, data);
}
return node;
}
答案 0 :(得分:0)
目前,如果nodeToAdd.data == node.data
,您的方法不会执行任何操作,因为两个if
条件都会失败。你可能想要:
if (nodeToAdd.data < node.data) {
...
else {
...
}
在这种情况下,相同的节点将插入右侧。如果您希望将它们插入左侧,请创建if
条件<=
。
这些都没有解释你提到的堆栈溢出,但这可能是一个无关的bug。我注意到您的代码依赖于添加的节点为null子节点。我建议你明确断言这个以确保在这个方法中没有向你的树添加循环。他们很可能会被添加到其他地方。
assert nodeToAdd.leftChild == null;
assert nodeToAdd.rightChild == null;
答案 1 :(得分:0)
我刚在树上尝试了你的代码。看起来很有效。
private Node put(Node i, Key key, Value value) {
if (i == null) return new Node(key, value, 1);
// int compare = key.compareTo(i.key);
// if (compare < 0) i.left = put(i.left, key, value);
// else if(compare > 0) i.right = put(i.right, key, value);
// else i.value = value;
//
// //update N while unwinding stack
// i.N = size(i.left) + size(i.right) + 1;
int compare = key.compareTo(i.key);
if (compare < 0) {
if (i.left == null) i.left = new Node(key, value, 1);
else put(i.left, key, value);
}
if (compare >= 0) {
if (i.right == null) i.right = new Node(key, value, 1);
else put(i.right, key, value);
}
return i;
}
//main
BST<String, Integer> bst = new BST<>();
String[] s = {"S", "S", "E", "E", "X", "A", "R", "C", "H", "M"};
for (int i = 0; i < s.length; i++) {
bst.put(s[i], i);
}
for(String key: bst.keys()) System.out.print(key + " "); // levelordered
输出:S E S A E X C R H M