在JAVA中更新二进制搜索树中的父节点

时间:2014-02-02 22:09:52

标签: java binary-search-tree

我正在使用二进制搜索树,我在更新/添加当前节点的父节点时遇到了一些问题。父节点没有正确更新。这就是我想要做的事情:

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

这不是正确的输出。

需要帮助我确定如何正确地做到这一点。

2 个答案:

答案 0 :(得分:3)

看起来节点的插入工作正常。 print语句是错误的,因为在递归调用之后调用它们以插入下一个Node。例如,在插入(root,1)之后,您的函数可以工作,并且您具有以下结构:

          4
         /
        1

现在当你调用insert(root,2)时,你最终会在代码中结束:

if(node.left != null)
        {


        insert(node.left, value);   
        System.out.println("Parent node of node"+ node.left.value+"is:"+prevnode.value);
        }
调用

insert(node.left,value),然后发生print语句。所以,虽然你的新树看起来像这样:

          4
         /
        1
         \
          2

下一个印刷声明

        System.out.println("Parent node of node"+ node.left.value+"is:"+prevnode.value);

将打印出node.left.value为1和prevnode.value为4.您可能希望更改print语句的位置,或者编写打印节点和父节点的新方法。

编辑: 我会在你的main方法中运行这个方法来测试树结构:

    public void printParents(Node n){
    if(n.left!= null){
        printParents(n.left);
    }
    if(n.right!=null){
        printParents(n.right);
    }
    if(n.parent != null){
        System.out.println("Parent of " + n.value + " is " + n.parent.value);
    }
    else{
        System.out.println("The root node is" + n.value);
    }
}

我在这里打电话:

public static void main(String args [])
{
binarytree obj = new binarytree();
obj.creatBST();
Node n = obj.root;
obj.printParents(n);
//obj.printInOrder();
//obj.check();
}

答案 1 :(得分:1)

对于初学者,您可能想要修复插入方法:

Node currentNode;
public void setCurrentNode(Node node) {
    currentNode = node;
}

public boolean insert(int value) {
    //You should probably insert from an instance variable, not an explicit parameter
    Node n = new Node(currentNode, value);
    if (currentNode.left == null) currentNode.left = n;
    else if (currentNode.right == null) currentNode.right = n;
    else return false;    //If insert failed because currentNode was full
    return true;
}