二叉搜索树递归嵌件不显示任何内容(Binary Search Tree Recursive inse

2019-07-04 14:50发布

我做的二叉搜索树一种小型的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与根是一个节点插入到与ELEM是一个字符串,但它不显示任何信息出来,好像树没有填写的。 我敢肯定,这是问题,我的递归插入,但我不知道在哪里,我需要使用不返回任何内容,我认为是不可能的递归插入方法。

任何帮助将是巨大的。

Answer 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 );
    }


Answer 2:

虽然递归插入BST似乎微不足道,它很容易使一个参数传递的错误,会抵消你的企图。 要递归调用插入功能,您必须通过对象BSTNode root作为参数之一, 并更改其内容 ,而不是它所指向。

在下面的代码, root = new BSTNode( elem ); 只是改变了局部变量的地址root所指向,并且改变是不可见的this.root 。 在分配之前, root具有值null ,这是由价值复制this.root时BST是空的。 转让后, 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);
    }
}      

由大角额外插入的代码是正确的,因为到的内容所做的修改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 );
}


Answer 3:

这台BST根和允许类正常工作,改变

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

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


文章来源: Binary Search Tree Recursive insert not displaying anything