【问题标题】:Why is the root always null in this method insert method for binary tree为什么此方法中的根始终为空插入二叉树的方法
【发布时间】:2013-12-05 23:55:55
【问题描述】:

我正在尝试为 BST 类实现递归插入节点方法

 public void insertNode(Node r, Node n)
{
    if(r == null)
    {
        System.out.println("r=n"+ n.data);
        r = n;
    }
    else
    {
        System.out.println("r=! null finding place in tree for "+ n.data);
        if(n.data <= r.data)
        {
            if(r.left == null)
                r.left = n;
            else
                insertNode(r.left, n);
        }
        else
        {
            if(r.right == null)
                r.right = n;
            else
                insertNode(r.right, n);
        }
    }
}

我试图像这样调用这个方法:

  int[] arrTree = {34, 2, 56, 12, 44, 39, 56, 1};
    BT t = new BT();
    for (int i = 0; i < arrTree.length; i++)
    {
        //System.out.println("Tree Root = "+ t.getRoot());
        BT.Node n =  t.new Node(arrTree[i]);
        t.insertNode(t.root, n);
    }

但我总是得到这个输出:

 r=n34
 r=n2
 r=n56
 r=n12
 r=n44
 r=n39
 r=n56
 r=n1

Node 是 BT 的内部类。

经过数小时的跑步和尝试不同的事情后,我无法弄清楚我做错了什么。

【问题讨论】:

标签: java recursion binary-search-tree


【解决方案1】:

当你在方法中设置 r 时,它不会影响你传入的节点。所以永远不会设置 t.root。

【讨论】:

    【解决方案2】:

    Java 是传递值语言。如果是对象,则传递引用的值,从而创建 新引用

    public void insertNode(Node r, Node n) {
        if(r == null) {
            r = n;
        }
    

    在这里,您将 新引用 替换为另一个引用的根;对根 (t.root) 的原始引用保持不变。

    要解决这个问题,您可以去掉 insertNode() 方法中的第一个参数 - 树的根是其实现的一部分,因此树已经知道对其根的引用。将insertNode() 中的所有rs 更改为this.root

    【讨论】:

    • 您好,谢谢。但是如果我拿走了r,我怎么能使用递归方法呢?
    • 这里的措辞略有错误。您传递了引用的值,但引用的值不允许您重新分配它。您根本不会创建新的引用。
    • @Makoto 你会说什么被重新分配呢?因为你在重新分配一些东西。
    【解决方案3】:

    从您显示的代码来看,我的钱是在这里的错误:

    public void insertNode(Node r, Node n)
    {
        if(r == null)
        {
            System.out.println("r=n"+ n.data);
            r = n; //you overwrite the value of r but never use it
        }
    

    Node r 实际上是对t.root 所指的任何内容的单独引用,因此将r 替换为另一个值不会改变t.root 在方法之外引用的任何内容。您可以修改方法内的引用数据,但不能修改引用本身。

    【讨论】:

      猜你喜欢
      • 2017-03-12
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多