【发布时间】:2017-01-25 22:45:46
【问题描述】:
我的二叉搜索树似乎无法管理超过 3 个节点或无法显示它们。我需要迭代地添加它们并在分配中使用堆栈显示它们,但是如果 BST 有超过 3 个元素,则无法显示它们。
public boolean add(E b) {
//if tree is empty
if (root == null) {
root = new Node();
root.setValue(b);
count++;
return true;
} //if val is already in tree
else if (b.compareTo(root.getValue()) == 0) {
return false;
//if left or right spot is free
} else {
while (root != null) {
compareResult = root.value.compareTo(b);
spot = root;
if (compareResult < 0) {
if (root.left != null) {
spot = spot.left;
count++;
return true;
} else {
Node n = new Node<>();
n.setValue(b);
spot.left = n;
count++;
return true;
}
} else if (compareResult > 0) {
if (root.right != null) {
spot = spot.right;
count++;
return true;
} else {
Node n = new Node<>();
n.setValue(b);
spot.right = n;
count++;
return true;
}
} else {
return false;
}
}
}
return false;
}
public void display() {
//needs to use an iterator
if (root == null) {
System.out.println("Error");
} else {
Node CurrentNode;
CurrentNode = root;
while (!stack.isEmpty() || CurrentNode != null) {
if (CurrentNode != null) {
stack.push(CurrentNode);
CurrentNode = CurrentNode.right;
}
else {
Node m= stack.pop();
System.out.println(m.value);
CurrentNode = m.left;
}
}
}
}
public int size() {
return count;
}
@Override
public int compareTo(E t) {
return ordering.compare(root,t);
}
@Override
public int compare(E t, E t1) {
return t.compareTo(t1);
}
Node 类如下所示
public class Node<E extends Comparable> {
E value;
Node<E> left;
Node<E> right;
//constructor
public Node() {
value = null;
left = null;
right = null;
}
public void setValue(E t) {
value = t;
}
public void setLeft(Node<E> t) {
left = t;
}
public void setRight(Node<E> t) {
right = t;
}
public Node<E> getLeft() {
return left;
}
public Node<E> getRight() {
return right;
}
public E getValue() {
return value;
}
【问题讨论】:
-
这不是一个完整的答案,因为我不会为你做作业。但基本上,您的
add方法需要是递归的。事实上,它只在节点的根节点、左孩子或右孩子添加东西。您的大部分逻辑都可以删除,因为如果您插入的值 小于 根处的值,您可以再次调用add并传递左侧的节点。如果它大于根的值,您可以再次调用add,传递右侧的节点。您缺少此递归步骤。 -
如何递归调用它? BST 中的大多数对象都是 Node 对象,所以我不能再调用 add 了。我只能在 E 上调用 Add ,然后我不知道如何结束程序。
-
您有几个选择。您可以将
add方法放在Node类中。然后Tree类中的add方法将检查Node是否存在,如果存在则在该Node上调用add。或者,您可以使Node类中的left和right实际上是树,而不仅仅是节点。 -
我本来是为了node类里面有add方法,但是老师说node类应该只包含对左右的引用。除此之外,她在课堂上指示做一些类似于我在 add 方法中所做的事情,并说我们不应该使用递归。我觉得自己真的被困住了,Node 课程正是她指示我们制作的方式。
-
你的老师说你不应该使用递归?这很奇怪。递归是正确的方法。我想你可以使用一个巨大的循环,当你找到正确位置的父节点来添加节点时,它会沿着树向下并退出。我可以看到这就是您尝试做的事情,但是您的条件
while(root != null)是错误的,因为一旦您到达else子句,root将始终不为空。
标签: java stack binary-search-tree iterable