【问题标题】:Binary Search Tree Recursive insert not displaying anything二叉搜索树递归插入不显示任何内容
【发布时间】:2012-11-24 01:57:31
【问题描述】:

我在二叉搜索树上做一个小的 Java 工作,但是当我将一个节点递归插入到树中并显示它时,我什么也没得到。我已经研究了一段时间了,我不确定,但我认为这是一个通过引用的问题。

这是我的代码:

public class BST {

    private BSTNode root; 

    public BST() {
        root = null;
    }

    public BSTNode getRoot() {
        return root;
    }

    public void insertR( BSTNode root, Comparable elem ) {

        if ( root == null ) {
            root = new BSTNode( elem );
        }
        else {
            if ( elem.compareTo( root.element ) < 0 ) {
                insertR( root.left, elem );
            } else {
                insertR( root.right, elem );
            }
        }

    }

    public void printInOrder (BSTNode root) {
        if (root != null) {

            printInOrder(root.left);
            System.out.println(root.element);
            printInOrder(root.right);

        }
    }
}

class BSTNode {

    protected Comparable element;
    protected BSTNode left;
    protected BSTNode right;

    protected BSTNode ( Comparable elem ) {

        element = elem;
        left = null;
        right = null;

    }

}

我执行了一系列 insertR,其中 root 是要插入的节点,elem 是一个字符串,但它没有打印任何内容,就好像根本没有填充树一样。我确定这是我的递归插入的问题,但我不确定在哪里,我需要使用递归插入方法,它不返回任何我认为不可能的东西。

任何帮助都会很棒。

【问题讨论】:

  • 第二行不是私有 BSTNode 根吗??
  • 你也可以为可比较元素添加构造函数
  • 是的,它应该是 BSTNode 根,抱歉没有检查那部分。可比较的元素可以是任何东西,在这种情况下我使用字符串

标签: java recursion insert binary-search-tree


【解决方案1】:

BSTNodes 的左右元素为空。您需要在插入之前创建它们。否则,他们会创建一个空的悬挂 BSTNode() 并将其插入,而不连接到树的其余部分。

你可以换行,

            if ( elem.compareTo( root.element ) < 0 ) {
                insertR( root.left, elem );
            } else {
                insertR( root.right, elem );
            }

 if ( elem.compareTo( root.element ) < 0 ) {
        if ( root.left == null )
             root.left = new BSTNode( elem );
        else
            insertR( root.left, elem );
    } else {
        if ( root.right == null )
             root.right = new BSTNode( elem );
        else
             insertR( root.right, elem );
    }

【讨论】:

  • 我试过你的代码,似乎根从来没有设置任何东西,我尝试打印一些虚拟字符串,如果它传递到 if ( root == null ) 的 else 中,所以我仍然不确定。跨度>
  • 嘿,我终于明白了,在你的 sn-p 和额外的 if 语句的帮助下,我让它工作了,谢谢!顺便说一句,这是我在root = new BSTNode( elem ); 之后添加的行:if (root.element != null) this.root = root
【解决方案2】:

这设置了 BST 根并允许类正常工作,更改

    if ( root == null ) {
        root = new BSTNode( elem );
    }

    if ( root == null ) {
        root = new BSTNode( elem );
        if ( root.element != null ) {
            this.root = root;
        }
    }

【讨论】:

    【解决方案3】:

    虽然递归插入 BST 看起来微不足道,但很容易犯下参数传递错误,从而使您的尝试无效。要递归调用插入函数,您必须将对象 BSTNode root 作为参数之一传递并更改其内容而不是它指向的内容。

    在下面的代码中,root = new BSTNode( elem );只改变了局部变量root所指向的地址,这个改变对于this.root是不可见的。在赋值之前,root 的值为null,它是在 BST 为空时从this.root 复制的值。分配后,root 指向一些新创建的BSTNode,数据来自elem。代码的意图是使this.root 指向同一个新的BSTNode,但是没有办法通过使本地root 指向它来实现这一点。当insertR 返回时,this.root 仍然指向null!!

    insertR(root.left, elem);insertR(root.right, elem); 也会发生同样的错误。传递了参数,但由于没有进行内容更改,因此函数调用只会返回,没有更新到 BST 的信息。

    public void insert(Comparable elem) {
        insertR(this.root, elem);
    }
    
    public void insertR( BSTNode root, Comparable elem ) {
    
        if ( root == null ) {
            root = new BSTNode( elem );
        }
        else {
            if ( elem.compareTo( root.element ) < 0 ) {
                insertR( root.left, elem );
            } else {
                insertR( root.right, elem );
            }
        }
    
    }
    

    要递归更改 BST,应针对对象包含的变量而不是对象变量指向的变量进行更改。因此,当this.rootnull 时,您应该在其他地方而不是在insertR 内部处理第一次插入,如下所示:

    public void insert(Comparable elem) {
        if (this.root == null) {
            this.root = new BSTNode(elem);
        } else {
            insertR(this.root, elem);
        }
    }      
    

    Arcturus 的额外插入代码是正确的,因为对root 内容所做的更改会立即传播到this.root,因为它们指向同一个BSTNode 对象。当然这里root要求不是null,因为上面的代码已经处理了null的情况,所以满足了。

    if ( elem.compareTo( root.element ) < 0 ) {
        if ( root.left == null )
             root.left = new BSTNode( elem );
        else
            insertR( root.left, elem );
    } else {
        if ( root.right == null )
             root.right = new BSTNode( elem );
        else
             insertR( root.right, elem );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-15
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2013-12-28
      • 1970-01-01
      相关资源
      最近更新 更多