二叉排序(搜尋)樹是以關鍵碼為結點的二叉樹,其性質:如果任一結點的左子樹非空,則左子樹的所有結點的關鍵碼都小於根結點的關鍵碼;如果任一結點的右子樹非空,則右子樹的所有結點的關鍵碼都大於根結點的關鍵碼。二叉排序樹的儲存結構如下,
typedef struct binsortnode* pbinsortnode;
typedef struct binsortnode* binsorttree;
typedef binsorttree* pbinsort
struct binsortnode
;
下面是一顆二叉排序樹,
二叉排序樹的檢索
要向二叉排序樹插入乙個新的結點,需要先在樹中進行檢索,檢索的過程與二分法檢索相似,逐步縮小檢索的範圍 。設在二叉排序樹上查詢關鍵碼為key的結點,檢索成功時,position指向查詢到的結點指標;檢索失敗時,position指向該節點應該插入位置的父節點。注意,position是結點指標的指標型別,為什麼函式不直接返回結點指標型別?因為函式返回整型可以確定檢索的成功與否,同時又可以通過position得到新的結點應該插入位置的父節點,演算法實現如下,
int search(binsorttree t, keytype key, pbinsortnode *position)
else if(key < pre->key) p=p->llink;
else p=p->rlink;
}*position = pre;
return 0;
}
假設二叉排序樹共有n個結點,高度是h(log2n≤h≤n),則檢索的時間代價最壞為o(h)。
二叉排序樹的插入
實現了上面二叉排序樹的檢索,就可以很快地插入結點,即檢索操作是插入操作的一部分。所以,如果二叉排序樹為空樹,則新結點作為根結點。如果非空,則將新結點的關鍵碼與position的關鍵碼作比較,若前者小則將新結點插入到position的左子樹,否則插入到position的右子樹。具體演算法如下,
int insert(binsorttree t, keytype key)
p = new struct binsortnode;
if(p == null)
p->key = key; p->llink=p->rlink=null;
if(position == null) t = p; //原樹為空樹
else if(key < position->key) position->llink = p;
else position->rlink = p;
return 1;
}
二叉排序樹的構造既然實現了新結點的插入操作,那麼就可以將字典的關鍵碼一一插入到二叉排序樹中,從而實現二叉排序樹的構造演算法,
int createsorttree(binsorttree t, keytype *dic)
二叉排序樹的刪除
為了刪除乙個結點,必須首先找到它。注意,這裡沒有用到上面的檢索操作,因為那只提供了該節點的位置,但不知道其父節點的位置(不同於插入位置的父節點)。刪除操作的一種方式如下:
檢索被刪除結點p;
if(p無左子女)
用p的右子女代替p;
else
if(p == null) return 0; //不存在
if(p->llink == null)
else
delete p;
return 1;
}
另一種不同於下劃線部分:
else
p->key = max->key; //複製結點資訊,實現所謂的代替
if(premax == p) p->llink = max->llink; //max的父節點就是p
else premax->rlink = max->llink; //用max的左子女代替max
p = max; //為統一在下面釋放記憶體
}
二叉排序樹的實現
二叉排序樹是一顆特殊的二叉樹 對於樹上的任意乙個結點,根節點的值一定大於其左子樹上的任意結點的值,一定小於其右子樹上任意結點的數值。所以我們可以插入實現二叉排序樹,思路可以這樣 1 若當前樹為空,則x為根節點 2 如果樹不為空,比較根節點與之大小,若插入值小於根節點,就繼續比較跟節點的左子樹,即最終...
二叉排序樹的實現
包括二叉排序樹的增加 遍歷和刪除 include include typedef int mytype 二叉排序樹 typedef struct structtreebtree btree init void addchild btree tree,int num void printtree bt...
二叉排序樹的實現
查詢 偽 searchbst t,key 實現 bstree searchbst bstree t,int key 插入 偽 insertbst t,key else if key t key return else if key t key insert t rchild,key else ins...