二叉排序樹的實現

2021-08-17 07:52:16 字數 2280 閱讀 5596

二叉排序(搜尋)樹是以關鍵碼為結點的二叉樹,其性質:如果任一結點的左子樹非空,則左子樹的所有結點的關鍵碼都小於根結點的關鍵碼;如果任一結點的右子樹非空,則右子樹的所有結點的關鍵碼都大於根結點的關鍵碼。二叉排序樹的儲存結構如下,

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...