我做的二叉搜索树一种小型的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是一个字符串,但它不显示任何信息出来,好像树没有填写的。 我敢肯定,这是问题,我的递归插入,但我不知道在哪里,我需要使用不返回任何内容,我认为是不可能的递归插入方法。
任何帮助将是巨大的。
你走后,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 );
}
虽然递归插入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.root
是null
,你应该处理的第一插入别人,而不是内部某个地方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 );
}
这台BST根和允许类正常工作,改变
if ( root == null ) {
root = new BSTNode( elem );
}
至
if ( root == null ) {
root = new BSTNode( elem );
if ( root.element != null ) {
this.root = root;
}
}