当前位置: 首页 > 知识库问答 >
问题:

使用java插入二叉树不起作用

孙佑运
2023-03-14

我目前正在学习使用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);
    }
}

每当我添加一个项目,根仍然为空,没有右或左的项目,如果有人能帮助我,我会非常感激

共有2个答案

上官恩
2023-03-14

很好的代码,但递归并没有更进一步

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

并且初始根不会更新:

root = insertNode(root, d);

其他部分或最终退货是多余的。

代码风格的东西

将一个节点作为输入,并返回更新的节点值,因此调用模式应该如下所示

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

这是因为java永远无法为传递的参数表达式赋值:它没有按引用传递,而是按值传递f(x)从不分配给x

戚育
2023-03-14

root始终为空,因为您从未给它赋值。

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

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.left = insertNode(item.left, d);

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

 类似资料:
  • public static void main(String[]args){main main=new main();

  • 我创造了这个二叉查找树。我使用循环和递归编写了两种形式的插入方法。递归代码虽然看起来是正确的,但并不工作,我想不出问题是什么。当我使用insertRecursion方法创建树时,leftChild和rightChild总是为null。 }

  • 二叉搜索树(BST)和二叉树(BT)中的插入有什么区别?我知道,在BST中,您将新节点的值与根进行比较,如果较小,则添加到其左侧,如果较大,则将其添加到根的右侧。BT的程序是否相同?如果没有,插入和移除的步骤是什么?

  • 我最近完成了一个项目的二进制搜索树,我正在工作。很顺利,我学到了很多。然而,现在我需要实现一个常规的二叉树...出于某种原因,这让我难倒了。 我正在寻找一种方法来做我的InsertNode功能... 通常在BST中,您只需检查数据 有谁能帮我实现一个函数,只需将一个新节点从左到右不按特定顺序添加到二叉树中? 以下是我的BST插页:

  • 到目前为止我的理解是: > (i)调用值=10的。由于root已经设置为50,如果条件为10<50,程序将进入第二个。 (ii)调用Root.left为10,节点值为2的递归insert函数。程序再次进入第二个if条件,条件为2<10。 (iii)再次调用Root.left为None,value为2的递归insert函数。现在程序进入first if条件,root获得值2。这将完成递归重复调用,程

  • 我试图在二叉树中插入节点,如果我用addNode(Node root)替换方法addNode(Node Node)代码运行良好。这是因为我在第一行声明了吗?请解释一下。addNode方法由于字数限制而不完整,否则它是完整的,运行良好。