62,614
社区成员
发帖
与我相关
我的任务
分享
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();
}
}
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");}
}
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;}
}
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;
}
}