【发布时间】:2014-02-03 06:55:36
【问题描述】:
我正在研究二叉搜索树,在更新/添加当前节点的父节点时遇到了一些问题。父节点没有正确更新。这就是我想要做的:
public class binarytree {
private Node root;
static class Node{
Node left;
Node right;
int value;
Node parent;
public Node(Node parent,int value)
{
this.value = value;
this.left = null;
this.right = null;
this.parent = parent;
}
}
public void creatBST()
{
root = new Node(null,4);
System.out.println("Binary Search tree with root = "+ root.value);
insert(root,1);
insert(root,2);
insert(root,3);
insert(root,6);
insert(root,5);
insert(root,7);
}
public void insert(Node node, int value)
{
Node prevnode = node;
if(value < node.value)
{
if(node.left != null)
{
insert(node.left, value);
System.out.println("Parent node of node"+ node.left.value+"is:"+prevnode.value);
}
else
{
node.left = new Node(prevnode,value);
}
}
else if(value > node.value)
{
if(node.right != null)
{
//prevnode = node;
insert(node.right, value);
System.out.println("Parent node of node"+ node.right.value+"is:"+prevnode.value);
}
else
{
node.right = new Node(prevnode,value);
}
}
}
public static void main(String args [])
{
binarytree obj = new binarytree();
obj.creatBST();
//obj.printInOrder();
//obj.check();
}
}
我得到的输出是:
Binary Search tree with root = 4
Parent node of node1is:4
Parent node of node2is:1
Parent node of node1is:4
Parent node of node6is:4
Parent node of node6is:4
这不是正确的输出。
需要帮助我确定如何正确执行此操作。
【问题讨论】:
-
这个我没太认真研究过,不过貌似
left和right是左右孩子。如果是这种情况,我们应该总是有node.left.parent==node和node.right.parent==node(对于非空子),对吗?但是在node.right = new Node(prevnode,value);之后,那么node.right.parent就是prevnode,这似乎违反了那个不变量。同样,我没有尝试过或详细研究过它,所以也许那个代码是可以的。但它看起来很奇怪。 -
@ajb prevnode 每次调用 insert() 时都会用 node 初始化。那么,在 insert() 中 prevnode 和 node 的值不应该相同吗?
-
看来你是对的。就像我说的,我没有详细研究代码。但是有一个单独的
prevnode变量,其唯一目的似乎是保持与node相同的值,有点令人困惑。有没有理由拥有prevnode? -
我只是尝试将父节点添加到每个节点,以便我可以进行一些额外的处理,例如查找中序继任者。为此,我创建了 prevnode 变量来表示每个节点的父节点