插入二叉树不能使用java

问题描述 投票:1回答:2

我目前正在学习使用java的树,我在这里插入二进制树中的项目有一些错误我不知道为什么它不起作用

这是代码:树节点:

public class TNode {
    int data;
    TNode left;
    TNode right;

    public TNode(int data) {
        this.data = data;
        left = null;
        right = null;
    }
}

树类:

public class Tree {
    TNode root;

    public Tree(){
        root = null;
    }

    public TNode insertNode(TNode item, int d) {
        if (item == null) {
            return new TNode(d);
        }

         if (d < item.data) {
            item.left = insertNode(item, d);
        }

        if (d > item.data) {
            item.right = insertNode(item, d);
        } else {
            return item;
        }

        return item;
    }

    public void add(int d) {
        insertNode(root, d);
    }
}

每当我添加一个项目时,如果有人可以帮助我,那么根将保持为空,没有右边或左边的项目,我会非常感激

java search data-structures tree binary
2个回答
2
投票

root始终为null,因为您从未为其赋值。

您可以添加到方法的开头检查并分配它

public TNode insertNode(TNode item, int d){
    if(item == null){
        TNode node = new TNode(d);
        if (root == null) { 
            root = node;
        }
        return node
    }
    ... rest of method isn't changed...

此外,当您进行递归时,您应该使用正确的子节点进行调用,而不是始终使用item进行调用,因此例如,第一种情况是:

    item.left = insertNode(item.left, d);

对于第二种情况,您只需使用item.right


1
投票

精细的代码,但递归不会更进一步

item.left = insertNode(item.left, d);
item.right = insertNode(item.right, d);

并且初始根未更新:

root = insertNode(root, d);

其他部分或最终回报是多余的。


关于代码风格的东西

insertNode有一个节点作为输入,并返回更新的节点值,因此调用“模式”应该是这样的

X = insertNode(X, d); // X is some expression

这是因为java永远不会分配给传递的参数表达式:它没有pass-by-reference,而是pass-by-value; f(x)从未分配给x

© www.soinside.com 2019 - 2024. All rights reserved.