查找——二叉排序樹

用線性表作爲表的組織形式時,用二分查找效率最高。但二分查找只能用於順序存儲結構,不能用鏈式存儲結構,不適用於插入刪除操作頻繁的情況,只適合靜態查找表

對動態查找表進行高效率查找,最好用二叉排序樹

1.基本概念

二叉排序樹(Binary Sort Tree):爲空或滿足以下條件:
   (1)每個結點左子樹上所有結點的關鍵字,值都小於該結點的關鍵字;
   (2)每個結點右子樹上所有結點的關鍵字,值都大於該結點的關鍵字;
   (3 )左右子樹本身也是二叉排序樹。

2.特點

(1)對任一節點x,左(右)子樹任一結點y的關鍵字必小於(大於)x的關鍵字;
(2)各結點關鍵字是唯一的,(但實際應用不能保證元素都不相同,此時可以將左子樹關鍵字改爲小於等於,或者右子樹關鍵字大於等於)
(3)按中序遍歷該樹得到的是遞增有序序列。

3.二叉排序樹的插入和生成

初始二叉樹爲空,然後讀入元素,插入樹中。已知關鍵字爲key的結點s,將其插入到二叉排序樹中:
    (1)二叉樹爲空,key爲二叉樹的根;
    (2)非空,如果key小於根結點的值,則插入左子樹,如果key大於根結點的值,則插入右子樹,等於的話停止插入。
Node類:
//二叉樹結點類
public class Node {
	private Integer data;
	private Node left;
	private Node right;
	
	public Node() {}
	
	public Node(int data) {
		this.data=data;
	}
	
	public Integer getData() {
		return this.data;
	}
	
	public void setData() {
		this.data=data;
	}
	
	//得到左子樹
	public Node getLeft() {
		return this.left;
	}
	
	public Node getRight() {
		return this.right;
	}
	
	public void setLeft(Node left) {
		this.left=left;
	}
	
	public void setRight(Node right) {
		this.right=right;
	}
}
創建和插入結點實現:
public Node createBST(Node root,int []datas) {
		root=null;
		int index=0;
		while(index<datas.length)
		{
			root=insertBST(root,datas[index]);
			index++;
		}
		return root;
	}
	
	//插入元素,非遞歸
	public Node insertBST(Node root,int data) {
		Node insertNode=new Node(data);
		while(root!=null) {
			if(root.getData()==data) {
				System.out.println("該元素已存在");
				return root;
			}
			else if(data<root.getData()) {
				if(root.getLeft()!=null) {
					root=root.getLeft();
				}
				else {
					root.setLeft(insertNode);
					return root;
				}
			}
			else if(data>root.getData()) {
				if(root.getRight()!=null) {
					root=root.getRight();
				}
				else {
					root.setRight(insertNode);
					return root;
				}
			}
	    }
		root=insertNode;
		return root;
	}
	
	//插入元素 遞歸
	public Node rInsertBST(Node root,int data) {
		Node insertNode=new Node(data);
		if(root==null) {
			root=insertNode;
		}
		else if(data<root.getData()) {
			root=root.getLeft();
			root=rInsertBST(root,data);
		}
		else if(data>root.getData()) {
			root=root.getRight();
			root=rInsertBST(root,data);
		}
		return root;
	}

4.查找

查找的元素key與當前結點的值data比較,如果key<data則到當前結點的左子樹搜索;如果key>data則到當前結點的右子樹搜索;
key==data則找到該元素;
一直搜索到空,則不存在要找的元素。
public boolean search(Node root,int data) {
		while(root!=null) {
			if(root.getData()==data)
				return true;
			else if(data<root.getData())
				root=root.getLeft();
			else if(data>root.getData())
				root=root.getRight();
		}
		return false;


5.算法分析

(1)二叉排序樹等概率下,查找成功時平均查找長度爲
     
(2)二叉排序樹查找的平均查找長度與二叉樹的形態有關
n個結點的二叉排序樹不唯一,結點插入順序不同,樹的形態和深度也不同
     a.最壞情況下,是深度爲n 的單支樹,平均查找長度和順序表一樣是(n+1)/2
     b.最好情況下,樹的形態比較均勻,得到的是與二分查找的判定樹相似的二叉排序樹,平均查找長度爲lgn
     c.插入、刪除的時間複雜度均爲O(lgn)
     



發佈了34 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章