數據結構之二叉搜索樹的實現

二叉搜索樹的接口類

public interface BinarySearchTree extends BinaryTree
{
    Object find(Object obj);
    Object update(Object obj);
    boolean insert(Object obj);
    boolean delete(Object obj);
    void ascend();
}

二叉搜索樹的鏈接存儲類的實現

public class LinkBinarySearchTree extends LinkBinaryTree
{
	public LinkBinarySearchTree(){
		super();
	}
	public LinkBinarySearchTree(BTreeNode st){
		super(st);
	}
	public Object find(Object obj){
		if(root==null) return null;
		BTreeNode st=root;
		while(st!=null){
			if(((Comparable)obj).compareTo(st.element)==0)
				return st.element;
			else if(((Comparable)obj).compareTo(st.element)<0)
				st=st.left;
			else
				st=st.right;
		}
		return null;
	}
	public Object update(Object 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(pt.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;
		}
		else 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 Example{
	 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.print("二叉搜索樹bst的廣義表形式:");bst.printBTree();
		 System.out.print("前序:");bst.traverseBTree("preOrder");
		 System.out.print("中序:");bst.traverseBTree("inOrder");
		 System.out.print("後序:");bst.traverseBTree("postOrder");
		 System.out.print("按層:");bst.traverseBTree("levelOrder");
		 System.out.print("升序:");bst.ascend();
		 System.out.println("深度:"+bst.depthBTree());
		 System.out.println("結點數:"+bst.countBTree());
		 System.out.println("查找38的結果:"+bst.find(38));
		 System.out.println("刪除73的結果:"+bst.delete(73));
		 System.out.println("刪除40的結果:"+bst.delete(40));
		 System.out.println("刪除23的結果:"+bst.delete(23));
		 System.out.print("運算後的二叉搜索樹bst的廣義表形式:");bst.printBTree();
	 }
 }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章