所以,我有以下代码在三元搜索树中插入一个元素(左树少,中间相同,右树更大)
public void insert (TrinaryTree<T> root, T data) {
//if the given tree doesn't exist yet
if (root == null){
root = new TrinaryTree<T>(data);
}
//if the given value is greater, insert to the right
else if (root.getData().compareTo(data) > 0){
insert (root.right, data);
}
//if the given value is equal, insert to the mid
else if (root.getData().compareTo(data) == 0) {
insert (root.mid, data);
}
//if the given value is less, insert to the left
else {
insert (root.left, data);
}
}
然后我尝试打印出我的树(按顺序遍历以检查我所做的是否正确使用此 -
public void inorderTraversal (TrinaryTree<T> root){
if (root != null){
inorderTraversal(root.getLeft());
System.out.println(root.getData());
inorderTraversal(root.getRight());
}
}
现在当我尝试运行主类时,就是这个 -
public static void main (String [] args) {
TrinaryTree<Integer> tree = new TrinaryTree<Integer>(5);
tree.insert(tree, 4);
tree.insert(tree, 9);
tree.insert(tree, 5);
tree.insert(tree, 7);
tree.insert(tree, 2);
tree.insert(tree, 2);
tree.inorderTraversal(tree);
}
我只得到输出5.我想通了,因为主树的左右子树是空的。我不确定为什么会这样。我的插入函数有效,因为我将一个print语句放入insert函数,并且语句确实打印出来。为什么子树仍为空?
答案 0 :(得分:1)
查看insert
的代码!一旦你用null
值调用它(你想要向左或向右放置一些东西),那么很可能一切都是空的。
root.left
和root.right
(可能)为null,您的代码不会
将新创建的节点添加到上一级节点。 NPE
?)最重要的是,当您使用未初始化的值(左侧或右侧)调用insert
时,您的代码将创建一个TrinaryTree
节点,但它无法将其添加到其中parent(您可能打算这样做),并且在方法调用之后将新创建的节点进行垃圾收集。