我在显示二叉搜索树时遇到问题
我希望能够看到插入到树中的每个值,但我不确定错误的位置。还有什么我应该改变,以使这个代码更功能或更容易阅读?
0
这是显示方法:
class BSTNode {
public int value; // data item (key)
public BSTNode leftChild; // this node's left child
public BSTNode rightChild; // this node's right child
public void displayNode() // display this node
{
StringBuilder node = new StringBuilder();
node.append("{");
node.append(value);
node.append("}");
System.out.println(node);
}
}
class BSTree {
private BSTNode root; // first node of tree
public BSTree() {
root = null;
}
public BSTNode find(int searchValue) // looks for node with certain key
{
BSTNode current = root;
while (current.value != searchValue) {
if (searchValue < current.value)
current = current.leftChild;
else
current = current.rightChild;
if (current == null)
return null;
}
return current;
}
public void insert(int value) // insert a new Node
{
BSTNode newNode = new BSTNode();
BSTNode current, parent;
newNode.value = value;
if (root == null)
root = newNode;
else {
current = root;
while (true) {
parent = current;
if (value < current.value) // go left
{
current = current.leftChild;
if (current == null) // if end of line
{
parent.leftChild = newNode;
return;
}
} // end left
else // go right
{
current = current.rightChild;
if (current == null) // if end of the line
{
parent.leftChild = newNode;
return;
}
}
}
}
}
和主要方法
public void displayBSTree() // display search tree
{
Stack<BSTNode> treeStack = new Stack<BSTNode>();
treeStack.push(root);
int numOfBlanks = 32;
boolean isRowEmpty = false;
System.out.println("\n");
while (isRowEmpty == false) {
Stack<BSTNode> localStack = new Stack<BSTNode>();
isRowEmpty = true;
for (int x = 0; x < numOfBlanks; x++)
System.out.print(" ");
while (treeStack.isEmpty() == false) {
BSTNode temp = (BSTNode)treeStack.pop();
if (temp != null)
{
System.out.print(temp.value);
localStack.push(temp.leftChild);
localStack.push(temp.rightChild);
if (temp.leftChild != null || temp.rightChild != null)
isRowEmpty = false;
}
else {
System.out.print("--");
localStack.push(null);
localStack.push(null);
}
for (int y = 0; y < numOfBlanks*2-2; y++)
System.out.print(" ");
}
System.out.println();
numOfBlanks /= 2;
while (localStack.isEmpty() == false)
treeStack.push(localStack.pop());
}
System.out.println();
}
目前输出
public class ShowBST {
public static void main(String[] args) {
int[] values = new int[] {23, 17, 5, 90, 12, 44, 38, 84, 77, 3, 66, 55, 1, 19, 37, 88, 8, 97, 25, 50, 75, 61, 49};
BSTree tree = new BSTree();
for (int value : values) {
tree.insert(value);
}
tree.displayBSTree();
}
}
答案 0 :(得分:1)
在您使用insert
方法遍历树时,您不小心向左走,而不是向右走:
else // go right
{
current = current.rightChild;
if (current == null) // if end of the line
{
parent.leftChild = newNode;
return;
}
}
要修复,请将parent.leftChild
的引用更改为parent.rightChild
。
此外,您可以对代码进行改进。例如,创建一个带有BSTNode
类参数的构造函数,这样您就不必每次都设置.value
。像这样:
class BSTNode {
//constructor
public BSTNode(int value){
this.value = value;
}
}
然后换到
BSTNode newNode = new BSTNode(value);
答案 1 :(得分:1)
insert中的else条件将节点添加到leftChild而不是rightChild。
else // go right
{
current = current.rightChild;
if (current == null) // if end of the line
{
parent.leftChild = newNode;
return;
}
}
修复完你需要调整间距后,所有空值都会用完空白,所以数字开始合并在一起。
答案 2 :(得分:0)
我猜这是副本&amp;粘贴错误:
else // go right
{
current = current.rightChild;
if (current == null) // if end of the line
{
parent.leftChild = newNode;
return;
}
}
应该是:
else // go right
{
current = current.rightChild;
if (current == null) // if end of the line
{
parent.rightChild = newNode;
return;
}
}
每次找到适合作为正确节点的东西时,你都会覆盖左侧节点,这就是为什么你只能看到第一个节点添加(23)和最后一个节点(49)应该向右移动但它看起来像在左边。