二分查詢法在演算法家族大類中屬於「分治法」,二分查詢的過程比較簡單,**見我的另一篇日誌,戳這裡!因二分查詢所涉及的有序表是乙個向量,若有插入和刪除結點的操作,則維護表的有序性所花的代價是o(n)。
就查詢效能而言,二叉查詢樹和二分查詢不分伯仲,但是,就維護表的有序性而言,二叉排序樹無須移動結點,只需修改指標即可完成插入和刪除操作,且其平均的執行時間均為o(lgn),因此更有效。二叉查詢樹,顧名思義,是一種可以用來二分查詢的樹資料結構,其左孩子比父節點小,右孩子比父節點大,還有乙個特性就是」中序遍歷「可以讓結點有序。在對關鍵字進行查詢的時候,根據關鍵字與根節點的關鍵字比較的結果,分別選擇繼續與其左子樹或者右子樹進行比較,直到找到所查詢的關鍵字或者訪問節點的左右子樹不存在(沒找到關鍵字)則退出!
二叉查詢樹的主要操作有:插入關鍵字,查詢關鍵字,刪除關鍵字。下面分別對這三個步驟做詳細描述和演算法實現。
為了方便,我將二叉查詢樹實現為乙個類,結構如下:
typedef struct1. 插入關鍵字的過程如下所示:node_
node;
class
binarytree
; ~binarytree();
bool
insertnode(t data);
bool
deletenode(t data);
node*findnode(t data);
private
: node *root;
};
插入過程的**如下:
bool其中的compeq和complt為2個巨集定義,用來比較兩個關鍵字的大小。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
;}
2. 查詢關鍵字的過程比較簡單,和二分查詢方法類似,**如下:
node*binarytree::findnode(t data)3. 刪除關鍵字的過程分為2種情況討論:單孩子的情況和左右孩子的情況。1> 單孩子情況分析:
如果刪除的節點有左孩子那就把左孩子頂上去,如果有右孩子就把右孩子頂上去,so easy!如圖所示:
2> 左右孩子情況分析:
首先可以這麼想象,如果我們要刪除乙個陣列的元素,那麼我們在刪除後會將其後面的乙個元素頂到被刪除的位置,如下圖所示:
那麼二叉樹操作同樣也是一樣,我們根據「中序遍歷(inorder tree walk)」找到要刪除結點的後乙個結點,然後頂上去就行了,原理跟「陣列」一樣一樣的。
好了,貼**:
bool好了,二叉查詢樹的**告一段落,我們在來分析一下二叉查詢樹的插入過程,假如有以下序列:<4, 17, 16, 20, 37, 38, 43>,則會生成如下所示二叉樹: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
;}
謝謝大家的閱讀,希望能夠幫到大家!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的右子樹的乙個結點,則 ...