我解决的一个问题是要求在二叉搜索树中插入一个节点,然后在最后返回整个二叉树的根。
我似乎遇到的问题是将插入的节点保存在原始树中,并给出它的根目录。我的代码如下:
static Node Insert(Node root,int value) {
insertAux(root, value);
return root;
}
static void insertAux(Node root, int value) {
if (root == null) {
root = new Node();
root.data = value;
root.left = root.right = null;
} else {
if (value > root.data) {
insertAux(root.right, value);
} else {
insertAux(root.left, value);
}
}
}
当我使用以下树测试时:
4
/ \
2 7
/ \
1 3
它应该导致:
4
/ \
2 7
/ \ /
1 3 6
我已经测试了这个,而且我的insertAux函数确实将root用户分配给一个新的Node(),并将该节点的数据命名为值6,当它遇到函数末尾的null case时。我还测试并确保我的Insert函数在整个调用结束时返回原始根。但是,当我尝试查看insertAux是否已将root.right.left分配给新的Node()并将其数据分配给Insert函数内部的6时,我得到一个空指针异常,其中root.right.left为null。为什么这样,我对Java的指针或节点赋值的理解是错误的?
答案 0 :(得分:2)
static Node insertAux(Node root, int value) {
if (root == null) {
root = new Node();
root.data = value;
root.left = root.right = null;
} else {
if (value > root.data) {
root.right = insertAux(root.right, value);
} else {
root.left = insertAux(root.left, value);
}
}
return root;
}
你的insertAux()方法应该是这样的。
首先,它应该有一个返回类型作为Node。
您在这里做错的是您没有在父节点和子节点之间创建链接。因此,在您的情况下,创建一个包含数据6的新节点但实际上从未将其分配给其父。
所以你需要通过返回它并将它分配给parent来分配新创建的节点。在你的方法中
if (value > root.data) {
root.right = insertAux(root.right, value);
} else {
root.left = insertAux(root.left, value);
}
答案 1 :(得分:1)
Java按值传递参数(即不通过引用),从函数返回后,root
的内部赋值将丢失。尝试以不同的方式返回,也许
static Node insertAux(Node root, int value) {