在java中获取二进制搜索树的根

时间:2014-12-14 15:29:01

标签: java binary-tree nodes binary-search-tree

我在java中创建了一个二进制搜索树,允许用户将节点添加到树

这是我在java中的二叉树的实现,它在创建时接受根节点,然后自动确定它应该将子节点添加到树的左侧或右侧。

public class BinarySearchTree {

    Node root = null;
    public BinarySearchTree(Node root){
        this.root =root;
    }
    public void add(int data){
        Node newNode = new Node(data);
        if(this.root ==null){
            newNode =this.root;
        }
        if(data>this.root.data){
            addRight(root,newNode);
        }

        if(data<this.root.data){
            addLeft(root,newNode);
        }
    }

    public Node getRoot(){
       return  this.root;
    }

    private void addLeft(Node root, Node newNode) {
        if(root.leftChild == null){
            root.leftChild = newNode;
        }
        else {
            this.root = this.root.leftChild;
            add(newNode.data);
        }
    }

    private void addRight(Node root,Node newNode) {
        if (root.rightChild == null){
            root.rightChild = newNode;
        }
        else {
            this.root = this.root.rightChild;
            add(newNode.data);
        }
    }

}

但是当我尝试使用getRoot()方法检索根节点时。它返回root的子节点而不是我传入的实际根节点。

这是使用它的一个例子

TreeHight treeHight = new TreeHight();
        Node root = new Node(100);
        BinarySearchTree unbalance = new BinarySearchTree(root);
        unbalance.add(200);
        unbalance.add(50);
        unbalance.add(250);
        unbalance.add(350);

当我尝试获取根节点时,它会将250作为第一个节点而不是100

如何检索此树的根节点?

2 个答案:

答案 0 :(得分:6)

在你的代码中写道:

 this.root = this.root.leftChild;
 add(newNode.data);

这可能是错误的行为?

您应该将其重写为:

add(this.root.leftChild,newNode);

然后定义一个递归方法,查看该项是否应该存储在子根的左/右。

类似的东西:

public void add(Node subroot, int data){
    if(data > subroot.data){
        addRight(subroot,data);
    }
    else if(data < subroot.data){
        addLeft(subroot,newNode);
    }
}

private void addLeft(Node subroot, int data) {
    if(subroot.leftChild == null){
        subroot.leftChild = new Node(data);
    }
    else {
        add(subroot.leftChild,data);
    }
}

private void addRight(Node subroot, int data) {
    if(subroot.rightChild == null){
        subroot.rightChild = new Node(data);
    }
    else {
        add(subroot.rightChild,data);
    }
}

然后add方法:

public void add(int data){
    if(this.root == null){
        this.root = new Node(data);
    }
    else {
        this.add(this.root,data);
    }
}

我认为二叉树的不变量是根保持不变。顺便提一下addRight也是如此。

最后你还写道:

newNode =this.root;

在你的add方法中,这当然没有多大意义。

答案 1 :(得分:1)

您正在编辑此行中的根目录:

this.root = this.root.rightChild;

我认为你应该递归地向右添加新节点,如下所示:

    else {
        addRight(this.root.rightChild, newNode);
    }

就像一个注释我认为你在“添加方法”这个块中有问题:

   if(this.root ==null){
        newNode =this.root; // it should be this.root = newNode;
    }