0

我正在尝试编写自己的二叉树。尽管我可以找到许多二叉搜索树的示例,但我还是决定自己编写。

到目前为止,我已经做到了这一点:

public class bTree {
bnode root=null;

void add(int val){
    bnode newnode= new bnode(val);
    bnode curr = this.root;
    bnode parent = null;

    if(this.root == null){
        this.root = newnode;
        System.out.println("Inserted at root \t"+newnode.value);
    }
    else{
            while( curr != null){
            System.out.println("Current Left and Right\t"+curr.left+"\t"+curr.right);

            if(curr.left == null){
                curr =  curr.left;
                curr = newnode;
                System.out.println("Inserted Left\t" +newnode.value);
                return;
            }
            if(curr.right ==  null){
                curr =  curr.right;
                curr = newnode;
                System.out.println("Inserted Right\t" +newnode.value);
                return;
            }
        }
    }
}

当我尝试将值添加到二叉树时,只有根能够添加值。我正在慢慢尝试编写其余的代码,它发现左孩子已满并回溯和所有情况。我的问题是为什么它甚至不向最左边的孩子添加下一个值(在第二次调用它时)。如果您不给我代码,我将非常感激,我想学习。

4

3 回答 3

3

在您的陈述中:

        if(curr.left == null){
            curr =  curr.left;
            curr = newnode;
            ...
        }

当您进行分配“curr = curr.left”时,“curr”被分配为 null 并且不再引用树中的任何内容。为了让树引用它,您需要将“curr”的左侧链接分配给新节点

        if(curr.left == null){
            curr.left = newnode;
            ...
        }

这是一张显示两者之间区别的图片: 在此处输入图像描述

于 2013-09-19T04:11:11.840 回答
2

为什么在第二次调用它时甚至没有将下一个值添加到最左边的孩子?

因为这不分配curr.leftnewnode

curr = curr.left;
curr = newnode;

使固定:

curr = curr.left = newnode;

请注意,您的代码中还有其他错误。您会通过更多电话找到他们。

于 2013-09-19T03:37:24.747 回答
1

因为当你输入 else {} 时,curr 总是 != null (因为 curr=root 和 root!=null),所以循环永远不会执行

于 2013-09-19T03:32:13.233 回答