java - NullPointerException 构建二叉搜索树
问题描述
我正在使用 Java 制作二叉搜索树,在尝试向树中添加节点时遇到了 NullPointerException。附件是我目前拥有的代码截图。
import java.util.Scanner;
import java.io.FileWriter;
import java.io.IOException;
/**
* Write a description of class BinaryTree here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class BinaryTree<T extends Comparable<T>> {
public TreeNode<T> root = null;
public void add(T value) {
if(root == null) {
root = new TreeNode<T>(value, 0);
} else {
add(root, value, 0);
}
}
private void add(TreeNode<T> node, T entry, int rank) {
if(entry.compareTo(node.value) < 0) {
if(node.left == null) {
node.left = new TreeNode<T>(entry, rank + 1);
} else {
add(node.left, entry, rank + 1);
}
}
if(node.right == null) {
node.right = new TreeNode<T>(entry, rank + 1);
} else {
add(node.right, entry, rank + 1);
}
}
public void printInOrder() {
printInOrder(root);
System.out.println();
}
private void printInOrder(TreeNode<T> node) {
if(node.left != null) {
printInOrder(node.left);
}
System.out.println(node.value);
if(node.right != null) {
printInOrder(node.right);
}
}
public void printPreOrder() {
printPreOrder(root);
System.out.println();
}
private void printPreOrder(TreeNode<T> node) {
if(node != null) {
System.out.println(node.value);
printPreOrder(node.left);
}
if(node.right != null) {
printPreOrder(node.right);
}
}
public void printPostOrder() {
printPostOrder(root);
System.out.println();
}
private void printPostOrder(TreeNode<T> node) {
if(node.left != null) {
printPostOrder(node.left);
}
if(node.right != null) {
printPostOrder(node.right);
}
System.out.println(node.value);
}
public void printTreeGraph() {
Queue<TreeNode<T>> queue = new Queue<>();
queue.push(root);
try {
FileWriter treeFile = new FileWriter("rankOrderTreeGraph.txt");
treeFile.write("digraph Tree {");
while(! queue.isEmpty()) {
TreeNode<T> node = queue.pop();
if(node.parent != null) {
treeFile.write("\t" + node.parent.value + "->" + node.value + ";");
System.out.println(node.value + ";");
}
if(node.left != null) {
queue.push(node.left);
}
if(node.right != null) {
queue.push(node.right);
}
}
treeFile.write("}");
treeFile.close();
} catch (IOException e) {
System.out.println("An error occurred");
}
}
public static void main(String[] args) {
BinaryTree<String> tree = new BinaryTree<>();
System.out.println("Enter name, enter 'quit' when finished");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
while(! name.equals("quit")) {
tree.add(name);
name = scanner.nextLine();
}
System.out.printf("Choose how to print tree: %n" +
"1: Inorder Traversal %n" + "2: Preorder Traversal %n" +
"3: Postorder Traversal %n" + "4: As a GraphViz Dot File %n" +
"q: Quit %n");
String choice = scanner.nextLine();
while(! choice.equals("q")) {
if(choice.equals("1")) {
tree.printInOrder();
System.out.println();
}
if(choice.equals("2")) {
tree.printPreOrder();
System.out.println();
}
if(choice.equals("3")) {
tree.printPostOrder();
System.out.println();
}
if(choice.equals("4")) {
tree.printTreeGraph();
} else {
System.out.println("Error");
}
System.out.println(">");
choice = scanner.nextLine();
}
}
}
/**
* Write a description of class TreeNode here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class TreeNode<T extends Comparable<T>> {
public T value;
public TreeNode<T> left;
public TreeNode<T> right;
public int rank;
public TreeNode<T> parent;
public TreeNode(T value, int rank) {
value = this.value;
left = null;
right = null;
this.rank = rank;
}
}
当我尝试将节点添加到列表时,我得到一个 NullPointerException,它指向私有方法 add 中的 if(entry.compareTo(node.value) < 0)。
解决方案
推荐阅读
- php - 尝试根据我的数据库记录自动选择选项
- ms-access - 如何更改新的 MS Access 最新版本设计?
- python - PyOpenGL - 最小 glDrawArrays 示例
- c# - 从另一个窗口上的特定控件获取文本
- javascript - 用javascript改变xsl:for-each标签的select属性值
- c# - 在退出时设置当前工作目录(.NET Core)
- google-chrome-extension - 创建chrome窗口时如何检测键盘事件?
- shell - 使用外壳/批处理解压缩 1 个 zip 文件中的多个特定文件夹的最佳方法
- python - 为什么列表和元组的“in”行为不同?
- python - 计算一个类的函数被执行的次数