java.lang.nullponiterException的问题

biange2019 2015-09-07 10:58:31

前面的程序应该没有问题,问题主要应该在 Example7_1.java和LinkBinarySearchTree.java上
Example7_1.java
public class Example7_1
{
public static void main(String[] args)
{
BinarySearchTree bst=new LinkBinarySearchTree();
Integer []a={23,45,89,40,73,12,49,72,20,44};
for(int i=0;i<a.length;i++)
bst.insert(a[i]);
System.out.println("前序:");bst.traverseBTree("preOrder");
System.out.println("中序:");bst.traverseBTree("inOrder");
System.out.println("后序:");bst.traverseBTree("postOrder");
System.out.println("按层:");bst.traverseBTree("levelOrder");
System.out.println("按节点值升序:");bst.ascend();
System.out.println("深度:"+bst.depthBTree());
System.out.println("节点数:"+bst.countBTree());
System.out.println("查找38的结果:"+bst.find(38));
System.out.println("删除48的结果:"+bst.delete(48));
System.out.println("删除73的结果:"+bst.delete(70));
System.out.println("删除40的结果:"+bst.delete(40));
System.out.println("删除23的结果:"+bst.delete(23));
System.out.println("运算后的形式:");bst.printBTree();
}
}

LinkBinarySearchTree.java

public class LinkBinarySearchTree extends LinkBinaryTree implements BinarySearchTree
{
public LinkBinarySearchTree()
{ super();} //初始为空树

public LinkBinarySearchTree(BTreeNode st)
{ super(st);} //把已知二叉树赋值

public Object find(Object obj)
{ //查找值为OBJ的节点
if(root==null) return null;
BTreeNode st=root;
while(st!=null)
{
if(((Comparable)obj).compareTo(st.element)==0)
return st.element;
if(((Comparable)obj).compareTo(st.element)<0)
st=st.left;
else st=st.right;
} //20
return null;
}

public Object update(Object obj)
{ //更新值为OBJ的节点
if(root==null) return null;
BTreeNode st=root;
while(st!=null)
{
if(((Comparable)obj).compareTo(st.element)==0)
{
Object x=st.element;
st.element=obj;
return x;
}
else if(((Comparable)obj).compareTo(st.element)<0)
st=st.left;
else st=st.right;
}
return null;
}

public boolean insert(Object obj)
{ //插入节点
BTreeNode st=root,pt=null;
while(st!=null)
{
pt=st;
if(((Comparable)obj).compareTo(st.element)==0)
return false;
else if(((Comparable)obj).compareTo(st.element)<0)
st=st.left;
else st=st.right;
}
BTreeNode s=new BTreeNode(obj);
if(pt==null) root=s;
else if(((Comparable)obj).compareTo(st.element)<0)
pt.left=s;
else pt.right=s;
return true;
}

public boolean delete(Object obj)
{ //删除节点
if(root==null) return false;
BTreeNode st=root,pt=null;
while(st!=null)
{
if(((Comparable)obj).compareTo(st.element)==0)//
break;
else if(((Comparable)obj).compareTo(st.element)<0)
{ pt=st;st=st.left; }
else { pt=st;st=st.right; }
}
if(st==null) return false;

if(st.left==null&&st.right==null)//分三种情况删除节点
{
if(st==root) root=null;
else if(pt.left==st)
pt.left=null;
else
pt.right=null;
}
if(st.left==null||st.right==null)
{
if(st==root)
if(st.left==null)
root=st.right;
else
root=st.left;
else if(pt.left==st&&st.left==null)
pt.left=st.right;
else if(pt.left==st&&st.right==null)
pt.left=st.left;
else if(pt.right==st&&st.left==null)
pt.right=st.right;
else if(pt.right==st&&st.right==null)
pt.right=st.left;
}
else if(st.left!=null||st.right!=null)
{
BTreeNode s1=st,s2=st.left;
while(s2.right!=null)
{ s1=s2;s2=s2.right;}
st.element=s2.element;
if(s1==st)
st.left=s2.left;
else
s1.right=s2.left;
}
return true;
}

public void ascend()
{traverseBTree("inOrder");}
}


LinkBinaryTree.java

public class LinkBinaryTree implements BinaryTree
{
protected BTreeNode root;

public LinkBinaryTree()
{
root=null;
}

public LinkBinaryTree(BTreeNode rt) //10
{
root=rt;
}

private void preOrder(BTreeNode rt) // xian geng xu
{
if(rt!=null)
{
System.out.print(rt.element+" ");
preOrder(rt.left); //20
preOrder(rt.right);
}
}

private void inOrder(BTreeNode rt) // zhong geng xu
{
if(rt!=null)
{
inOrder(rt.left);
System.out.print(rt.element+" "); //30
inOrder(rt.right);
}
}

private void postOrder(BTreeNode rt)
{
if(rt!=null)
{
postOrder(rt.left);
postOrder(rt.right); // 40
System.out.print(rt.element+" ");
}
}

private void levelOrder(BTreeNode rt)
{
Quene que=new SequenceQuene();
BTreeNode p=null;
que.enter(rt);
while(!que.isEmpty()) //50
{
p=(BTreeNode)que.leave();
System.out.print(p.element+" ");
if(p.left!=null)
que.enter(p.left);
if(p.right!=null)
que.enter(p.right);
}
}///////////////////////////
//60
public Object findBTree(BTreeNode rt, Object x) //查找节点
{
if(rt==null) return null;
else{
if(rt.element.equals(x))
{
return rt.element;
}
else
{
Object y; //70
y= findBTree(rt.left, x);
if(y!=null) return y;
y= findBTree(rt.right, x);
if(y!=null) return y;
return null;
}
}
}

private int depthBTree(BTreeNode rt)
{
if(rt==null)
return 0;
else{
int dep1=depthBTree(rt.left);
int dep2=depthBTree(rt.right);
if(dep1>dep2)
return dep1+1;
else
return dep2+1;
}
}
private int countBTree(BTreeNode rt)
{
if(rt==null)
return 0;
else
return countBTree(rt.left)+countBTree(rt.right)+1;
}
private void printBTree(BTreeNode rt)
{
if(rt!=null)
{
System.out.print(rt.element);
if(rt.left!=null||rt.right!=null)
{
System.out.print('(');
printBTree(rt.left);
if(rt.right!=null)
System.out.print(','); //160
printBTree(rt.right);
System.out.print(')');
}
}
}
public boolean createBTree(String str)
{
Stack sck=new SequenceStack();
root=null;
BTreeNode p=null;
int k=1;
char []a=str.toCharArray();
for(int i=0;i<a.length;i++)
{
switch(a[i]){
case ' ':
break;
case '(':
sck.push(p); k=1;
break;
case ')':
if(sck.isEmpty()){
System.out.println("二叉树广义表字符串错");
return false;
}
sck.pop();break;
case ',':
k=2;break;
default:
if((a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z'))
{
p=new BTreeNode(a[i]);
if(root==null)root=p;
else{
if(k==1)((BTreeNode)sck.peek()).left=p;
else ((BTreeNode)sck.peek()).right=p;
}
}
else
{
System.out.println("二叉树广义表字符串错");
return false;
}
} //switch
} //for
if(sck.isEmpty())return true;
else return false;
} // function

public boolean isEmpty()
{return root==null;}

public void traverseBTree(String s)
{
if(s.equals(mode[0])) preOrder(root);
else if(s.equals(mode[1])) inOrder(root);
else if(s.equals(mode[2])) postOrder(root);
else if(s.equals(mode[3])) levelOrder(root);
System.out.println();
}
public int depthBTree()
{
return depthBTree(root);
}
public int countBTree()
{
return countBTree(root);
}
public Object findBTree(Object obj)
{
return findBTree(root,obj);
}
public void printBTree()
{
printBTree(root);
System.out.println();
}
public void clearBTree()
{root=null;}
}

...全文
293 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
biange2019 2018-09-28
  • 打赏
  • 举报
回复
3年前的问题,一直耿耿于怀,今天终于有时间解决了
biange2019 2018-09-28
  • 打赏
  • 举报
回复
else if(((Comparable)obj).compareTo(st.element)<0) 确实是st==null 把st应该是pt就可以了
村儿里人 2015-09-09
  • 打赏
  • 举报
回复
看到贴长代码的 帖子感觉好头痛
sunandmoxi 2015-09-09
  • 打赏
  • 举报
回复
st = null
wula0010 2015-09-08
  • 打赏
  • 举报
回复
LinkBinarySearchTree的57行有空值啊,................... else if(((Comparable)obj).compareTo(st.element)<0) 断点调试看看哪个是空值,找出原因来
biange2019 2015-09-07
  • 打赏
  • 举报
回复
为方便测试,我把相关的类也贴出来 二叉树接口BinaryTree.tree

public interface BinaryTree
  {
    final String[] mode={"preOrder","inOrder","postOrder","levelOrder"};
    boolean createBTree(String gt);
    boolean isEmpty();
    void traverseBTree(String s);
    Object findBTree(Object obj);
    int depthBTree();
    int countBTree();
    void printBTree();
    void clearBTree();
  }
二叉搜索树接口BinarySearchTree.tree

public interface BinarySearchTree extends BinaryTree
{
	Object find(Object obj);
	Object update(Object obj);
	boolean  insert(Object obj);
	boolean delete(Object obj);
	void ascend();
}
树的节点 BTreeNode.tree

public class BTreeNode
{
	Object element;
	BTreeNode left,right;
	public BTreeNode(Object obj)
	{
	 element=obj;left=right=null;
	 }
	public BTreeNode(Object obj,BTreeNode lt,BTreeNode  rt)
	{
	  element=obj;left=lt;right=rt;
	 }
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧