遇上一个空指针报错,可是eclipse没有对代码显示警告
package sheji;
import java.util.ArrayList;
import java.util.Scanner;
import sheji.RecordNode;
import sheji.BSTree;
import sheji.KeyType;
import sheji.ElementType;
public class action {
public static <ReacordNode> void main(String[] args) {
boolean flag = true;
while (flag) {
System.out.println("=================================================");
System.out.println("请输入下列数字选择相应的操作:");
System.out.println("1.建立家谱成员信息");
System.out.println("2.查找家谱成员信息");
System.out.println("3.插入家谱成员信息");
System.out.println("4.修改家谱成员信息");
System.out.println("5.删除家谱成员信息");
System.out.println("6.显示所有家谱成员");
System.out.println("7.退出");
System.out.println("=================================================");
System.out.print("输入的数字为:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
BSTree bstree=new BSTree();
switch (num) {
case 1:
String[][]item= {
{"小明","男"},
{"大明","男"},
{"中明","女"}
};
int[]k= {1002, 1001,1003}; //关键字数组
KeyType[] key = new KeyType[k. length]; //关键字数组
ElementType[]elem=new ElementType[k.length]; //记录数据数组
for (int i = 0; i<k. length; i++)
{
key[i] = new KeyType(k[i]); //创建关键字对象
elem[i] = new ElementType(item[i]); //创建记录数据对象
System.out.println("家谱成员信息建立成功");
if(bstree.insertBST(key[i],elem[i])) { //若插入对象成功
System.out.print("["+key[i]+","+elem[i]+"]");
}
}
case 2:
System.out.println("\n 中序遍历二叉排序树");
bstree.inOrderTraverse(bstree.root);
System.out.println();
KeyType keyvalue =new KeyType();
keyvalue.key=1002;
RecordNode found =(RecordNode)bstree.searchBST(keyvalue);
if(found!=null) {
System.out.println("按编号查找:"+keyvalue+",成功!对应家族成员为:"+found.element);
}else {
System.out.println("按编号查找:"+keyvalue+",失败!");
}
keyvalue.key=1005;
found=(RecordNode)bstree.searchBST(keyvalue);
if(found!=null) {
System.out.println("按编号查找:"+keyvalue+",成功!对应家族成员为:"+found.element);
}else {
System.out.println("按编号查找:"+keyvalue+",失败!");
}
break;
default:
flag = false;
System.out.println("退出成功");
break;
}
}
}
}
package sheji;
import sheji.BSTree;
public class BSTree {
public BiTreeNode root;
public BSTree() {
root=null;
}
public void inOrderTraverse(BiTreeNode p) {
if(p !=null);
inOrderTraverse(p.lchild);
System.out.print(((RecordNode)p.data).toString()+" ");
inOrderTraverse(p.rchild);
}
public Object searchBST(Comparable key) {
if(key==null||!(key instanceof Comparable)) {
return null;
}
return searchBST(key);
}
private Object searchBST(BiTreeNode p,Comparable key) {
if(p!=null) {
if(key.compareTo(((RecordNode)p.data).key)==0)
{return p.data;
}
System.out.print(((RecordNode)p.data).key+"?");
if(key.compareTo(((RecordNode)p.data).key)<0) {
return searchBST(p.lchild,key);
}else {
return searchBST(p.rchild,key);
}
}
return null;
}
public boolean insertBST(KeyType keyType, ElementType elementType) {
// TODO Auto-generated method stub
return false;
}
}
=================================================
请输入下列数字选择相应的操作:
1.建立家谱成员信息
2.查找家谱成员信息
3.插入家谱成员信息
4.修改家谱成员信息
5.删除家谱成员信息
6.显示所有家谱成员
7.退出
=================================================
输入的数字为:1
家谱成员信息建立成功
家谱成员信息建立成功
家谱成员信息建立成功
中序遍历二叉排序树
Exception in thread "main" java.lang.NullPointerException
at sheji.BSTree.inOrderTraverse(BSTree.java:10)
at sheji.action.main(action.java:52)
不报错,顺利运行
报错了啊。
在中序遍历二叉排序树 下面那行inOrderTraverse的代码里。
NULL是因为你传了空对象。而且调用了方法,空对象没有方法所以报错。
参考这个
package com.zw.dataStructure;
/**
* 链表实现二叉树
*/
public class NodeTree {
static class Node {
int index;
int data;
Node parent;
Node left;
Node right;
public Node(int data) {
this.data = data;
}
@Override
public String toString() {
return "Node{" +
"index=" + index +
", data=" + data +
'}';
}
}
Node root;
public NodeTree(Node root) {
this.root = root;
this.root.index = 0;
this.root.parent = null;
this.root.left = null;
this.root.right = null;
}
public Node searchNode(int index) {
return search(root, index);
}
private Node search(Node node, int targetIndex) {
if (node.index == targetIndex) {
return node;
} else {
if (node.left != null) {
Node leftSearch = search(node.left, targetIndex);
if (leftSearch != null) {
return leftSearch;
}
}
if (node.right != null) {
Node rightSearch = search(node.right, targetIndex);
if (rightSearch != null) {
return rightSearch;
}
}
return null;
}
}
public boolean addNode(int index, int direction, Node newNode) {
Node node = searchNode(index);
if (node == null) {
return false;
}
//插左边
if (direction == 0) {
node.left = newNode;
newNode.index = node.index * 2 + 1;
} else {
//右边
node.right = newNode;
newNode.index = node.index * 2 + 2;
}
newNode.parent = node;
return true;
}
public boolean deleteNode(int index) {
Node node = searchNode(index);
if (node == null) {
return false;
}
Node parent = node.parent;
if (parent != null) {
if (parent.left == node) {
parent.left = null;
} else if (parent.right == node) {
parent.right = null;
}
return true;
}
return true;
}
/**
* 前序遍历 中 左 右
*/
public void preOrderTraverse() {
preOrder(root);
}
private void preOrder(Node node) {
System.out.print(node.data + " ");
if (node.left != null) {
preOrder(node.left);
}
if (node.right != null) {
preOrder(node.right);
}
}
/**
* 中序遍历 左 中 右
*/
public void inOrderTraverse() {
inOrder(root);
}
private void inOrder(Node node) {
if (node.left != null) {
inOrder(node.left);
}
System.out.print(node.data + " ");
if (node.right != null) {
inOrder(node.right);
}
}
/**
* 后序遍历 左右中
*/
public void postOrderTraverse() {
postOrder(root);
}
private void postOrder(Node node) {
if (node.left != null) {
postOrder(node.left);
}
if (node.right != null) {
postOrder(node.right);
}
System.out.print(node.data+" ");
}
public static void main(String[] args) {
Node root = new Node(3);
NodeTree tree = new NodeTree(root);
tree.addNode(0, 0, new Node(5));
tree.addNode(0, 1, new Node(8));
tree.addNode(1, 0, new Node(2));
tree.addNode(1, 1, new Node(6));
tree.addNode(2, 0, new Node(9));
tree.addNode(2, 1, new Node(7));
// System.out.println("111");
// System.out.println(tree.searchNode(0));
// System.out.println(tree.searchNode(1));
// System.out.println(tree.searchNode(2));
// System.out.println(tree.searchNode(3));
// System.out.println(tree.searchNode(4));
// System.out.println(tree.searchNode(5));
// System.out.println(tree.searchNode(6));
// System.out.println(tree.searchNode(7));
tree.deleteNode(3);
System.out.println("3 5 8 2 6 9 7");
System.out.println("\npreOrderTraverse:");
tree.preOrderTraverse();
System.out.println("\ninOrderTraverse:");
tree.inOrderTraverse();
System.out.println("\npostOrderTraverse:");
tree.postOrderTraverse();
}
}