向树中添加元素
Adding elements to tree
我有一个二叉树,我正在尝试添加元素
问题是如果我有并且在树中输入像 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;
}
目前如果 nodeToAdd.data == node.data
您的方法不执行任何操作,因为两个 if
条件都失败了。您可能想要:
if (nodeToAdd.data < node.data) {
...
else {
...
}
在这种情况下,相等的节点将被插入到右侧。如果你想让它们插入到左边,那么 if
条件 <=
.
None 其中解释了您提到的堆栈溢出,但这可能是一个不相关的错误。我注意到您的代码依赖于添加的具有空子节点的节点。我建议您明确断言这一点,以确保在此方法中不会向您的树中添加任何循环。它们很可能被添加到其他地方。
assert nodeToAdd.leftChild == null;
assert nodeToAdd.rightChild == null;
我刚在我的树上试过你的代码。看起来它有效。
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
我有一个二叉树,我正在尝试添加元素
问题是如果我有并且在树中输入像 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;
}
目前如果 nodeToAdd.data == node.data
您的方法不执行任何操作,因为两个 if
条件都失败了。您可能想要:
if (nodeToAdd.data < node.data) {
...
else {
...
}
在这种情况下,相等的节点将被插入到右侧。如果你想让它们插入到左边,那么 if
条件 <=
.
None 其中解释了您提到的堆栈溢出,但这可能是一个不相关的错误。我注意到您的代码依赖于添加的具有空子节点的节点。我建议您明确断言这一点,以确保在此方法中不会向您的树中添加任何循环。它们很可能被添加到其他地方。
assert nodeToAdd.leftChild == null;
assert nodeToAdd.rightChild == null;
我刚在我的树上试过你的代码。看起来它有效。
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