C 資料結構之二叉查詢樹(BST)

2022-03-08 17:27:55 字數 3061 閱讀 5374

二分查詢法在演算法家族大類中屬於「分治法」,二分查詢的過程比較簡單,**見我的另一篇日誌,戳這裡!因二分查詢所涉及的有序表是乙個向量,若有插入和刪除結點的操作,則維護表的有序性所花的代價是o(n)。

就查詢效能而言,二叉查詢樹和二分查詢不分伯仲,但是,就維護表的有序性而言,二叉排序樹無須移動結點,只需修改指標即可完成插入和刪除操作,且其平均的執行時間均為o(lgn),因此更有效。二叉查詢樹,顧名思義,是一種可以用來二分查詢的樹資料結構,其左孩子比父節點小,右孩子比父節點大,還有乙個特性就是」中序遍歷「可以讓結點有序。在對關鍵字進行查詢的時候,根據關鍵字與根節點的關鍵字比較的結果,分別選擇繼續與其左子樹或者右子樹進行比較,直到找到所查詢的關鍵字或者訪問節點的左右子樹不存在(沒找到關鍵字)則退出!

二叉查詢樹的主要操作有:插入關鍵字查詢關鍵字刪除關鍵字。下面分別對這三個步驟做詳細描述和演算法實現。

為了方便,我將二叉查詢樹實現為乙個類,結構如下:

typedef struct

node_

node;

class

binarytree

; ~binarytree();

bool

insertnode(t data);

bool

deletenode(t data);

node*findnode(t data);

private

: node *root;

};

1. 插入關鍵字的過程如下所示:

插入過程的**如下:

bool

binarytree::insertnode(t data)

/*setup new node

*/if ((x = (node*)malloc(sizeof(*x))) == 0

)

x->data =data;

x->parent =parent;

x->left =null;

x->right =null;

/*insert x in tree

*/if

(parent)

if(complt(x->data, parent->data))

parent->left =x;

else

parent->right =x;

else

root =x;

return

true

;}

其中的compeq和complt為2個巨集定義,用來比較兩個關鍵字的大小。

2. 查詢關鍵字的過程比較簡單,和二分查詢方法類似,**如下:

node*binarytree::findnode(t data)

3. 刪除關鍵字的過程分為2種情況討論:單孩子的情況和左右孩子的情況。1> 單孩子情況分析:

如果刪除的節點有左孩子那就把左孩子頂上去,如果有右孩子就把右孩子頂上去,so easy!如圖所示:

2> 左右孩子情況分析:

首先可以這麼想象,如果我們要刪除乙個陣列的元素,那麼我們在刪除後會將其後面的乙個元素頂到被刪除的位置,如下圖所示:

那麼二叉樹操作同樣也是一樣,我們根據「中序遍歷(inorder tree walk)」找到要刪除結點的後乙個結點,然後頂上去就行了,原理跟「陣列」一樣一樣的。

好了,貼**:

bool

binarytree::deletenode(t data)

node *x, *y;

/*find tree successor

*/if (pnode->left == null || pnode->right ==null)

y =pnode;

else

/*x is y's only child

*/if (y->left !=null)

x = y->left;

else

x = y->right;

/*remove y from the parent chain

*/if (x) x->parent = y->parent;

if (y->parent)

if (y == y->parent->left)

y->parent->left =x;

else

y->parent->right =x;

else

root =x;

/*y is the node we're removing

*//*

z is the data we're removing

*//*

if z and y are not the same, replace z with y.

*/if (y !=pnode)

else

return

true

;}

好了,二叉查詢樹的**告一段落,我們在來分析一下二叉查詢樹的插入過程,假如有以下序列:<4, 17, 16, 20, 37, 38, 43>,則會生成如下所示二叉樹:

謝謝大家的閱讀,希望能夠幫到大家!ps:文章中部分利用了另外一篇文章的插圖(戳這裡)!

published by windows live write!

資料結構之二叉查詢樹

針對二叉查詢樹的操作 增刪改查 的時間和樹的高度成正比,比如都有10個節點的乙個樹,樹高為4和樹高為10的操作時間肯定是不同的,這個時間實際上是o lgn 二叉查詢樹的期望的樹高是lgn,從而基本動態集合的操作平均時間為 lgn 通常二叉查詢樹基於鍊錶實現,每個節點儲存左,右子節點,如果想更方便的實...

資料結構之二叉查詢樹

二叉樹成為二叉查詢樹的性質是,對於樹種的每個節點x,他的左子樹中的所有關鍵字的值均小於x的關鍵字的值,而他的右子樹中的所有關鍵字的值均大於x的關鍵字的值。這意味著,該樹的所有元素均可以是用某種統一的方式排序。tree.h pragma once we define the binary tree.s...

資料結構之二叉查詢樹

二叉查詢樹 binary search tree 又被稱為二叉搜尋樹。設x為二叉查詢樹中的乙個結點,x節點包含關鍵字key,節點x的key值記為 ke y x k ey x 如果y是x的左子樹中的乙個結點,則 ke y y ke y x k ey y ke y x 如果y是x的右子樹的乙個結點,則 ...