我创建了一个二叉搜索树类,我是按照一些 YouTube 视频制作的。问题是,据我所知,我的代码与我遵循的指南中的代码完全相同。问题是,当我运行 main()
方法时,什么也没有发生。没有编译或运行时错误,程序什么也不做。应该发生的是,如果我使用遍历方法,它应该使用 toString() 方法打印出一些键和这些键的值,或者如果我使用findNode()
方法。我希望有人可以检查我的代码,看看他们是否可以发现任何逻辑错误等,因为我花了很长时间检查和重新检查我的代码,但我似乎无法发现它。
这是我的主要方法的代码:
public class BinarySearchTreeAss2 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
BinarySearchTree myTree = new BinarySearchTree();
myTree.addNode(50, 1);
myTree.addNode(25, 2);
myTree.addNode(15, 3);
myTree.addNode(30, 4);
myTree.addNode(75, 5);
myTree.addNode(80, 6);
myTree.inOrderTraversal(myTree.root);
System.out.println("\n\n");
myTree.preOrderTraversal(myTree.root);
System.out.println("\n\n");
myTree.postOrderTraversal(myTree.root);
System.out.println(myTree.findNode(30));
}
}
二叉搜索树类的代码:
public class BinarySearchTree {
Node root;
public void addNode(int key, int value) {
Node newNode = new Node(key, value);
if(root == null) {
root = newNode;
} else {
Node focusNode = root;
Node parent;
while(true) {
parent = focusNode;
if(key < focusNode.key) {
focusNode = focusNode.leftChild;
if(focusNode == null) {
parent.leftChild = newNode;
return;
} else {
focusNode = focusNode.rightChild;
if(focusNode == null) {
parent.rightChild = newNode;
return;
}
}
}
}
}
}
public void inOrderTraversal(Node focusNode) {
if(focusNode != null) {
inOrderTraversal(focusNode.leftChild);
System.out.println(focusNode);
inOrderTraversal(focusNode.rightChild);
}
}
public void preOrderTraversal(Node focusNode) {
if(focusNode != null) {
System.out.println(focusNode);
preOrderTraversal(focusNode.leftChild);
preOrderTraversal(focusNode.rightChild);
}
}
public void postOrderTraversal(Node focusNode) {
if(focusNode != null) {
postOrderTraversal(focusNode.leftChild);
postOrderTraversal(focusNode.rightChild);
System.out.println(focusNode);
}
}
public Node findNode(int key) {
Node focusNode = root;
while(focusNode.key != key) {
if(key < focusNode.key) {
focusNode = focusNode.leftChild;
} else {
focusNode = focusNode.rightChild;
}
if(focusNode == null) {
return null;
}
}
return focusNode;
}
}
class Node {
int key;
int value;
Node leftChild;
Node rightChild;
Node(int key, int value) {
this.key = key;
this.value = value;
}
@Override
public String toString() {
return value + " has the key " + key;
}
}
最佳答案
你弄乱了 if 语句大括号,这导致程序进入无限循环。
if (key < focusNode.key) {
focusNode = focusNode.leftChild;
if (focusNode == null) {
parent.leftChild = newNode;
return;
}
else {
focusNode = focusNode.rightChild;
if (focusNode == null) {
parent.rightChild = newNode;
return;
}
}
}
如果 key 小于 focusNode.key 则向左走,否则向右走,所以应该是这样
if (key < focusNode.key) {
focusNode = focusNode.leftChild;
if (focusNode == null) {
parent.leftChild = newNode;
return;
}
} else {
focusNode = focusNode.rightChild;
if (focusNode == null) {
parent.rightChild = newNode;
return;
}
}
关于Java 二叉搜索树在运行时不打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27302826/