二叉查詢樹(binary search tree)是一棵二叉樹,或稱為二叉搜尋樹,可能為空;一棵非空的二叉查詢樹滿足一下特徵:
1、每個元素有乙個關鍵字,並且任意兩個元素的關鍵字都不同;因此,所有的關鍵字都是唯一的。2、在根節點的左子樹中,元素的關鍵字(如果存在)都是小於根節點的關鍵字。
3、根節點的右子樹中,元素的關鍵字(如果存在)都是大於根節點的關鍵字。
4、根節點的左、右子樹也都是二叉查詢樹。
typedef
int mytype;
typedef
struct treenode
searchtree;
2.1 查詢
遞迴查詢關鍵字為data的元素,時間複雜度為o(h),h是樹的高度
二叉查詢樹的操作時間複雜度均為o(log2n)。
searchtree *
find
(mytype data, searchtree *t)
2.2 查詢最小值(遞迴實現)
根據二叉查詢樹的性質,遍歷左子樹。
searchtree *
findmin
(searchtree *t)
2.3 查詢最大值(非遞迴實現)
根據二叉查詢樹的性質,遍歷右子樹。
searchtree *
findmax
(searchtree *t)
2.4 插入
如果data不存在,則插入,根據二叉查詢樹的性質,如果大於根節點元素,進入右子樹,如果小於根節點元素則進入左子樹。
searchtree *
insert
(mytype data, searchtree *t)
else
if(data < t->element)
else
if(data > t->element)
return t;
}
2.5 刪除
刪除操作有三種情況
1、t是葉子節點。直接釋放該節點的空間,如果是根節點,則直接賦值為null。2、t有一棵非空子樹。如果是根節點,則t的唯一子樹成為根節點,如果非根節點,則使其父節點指標繞過該節點指向其唯一子節點,釋放空間。
3、t有兩棵非空子樹。一般策略是將該節點的元素替換成它的左子樹的最大元素或右子樹的最小元素(**中採用的是後者,即用右子樹的最小元素替換被刪除的節點),然後在刪除被替換的元素。
searchtree *
remove
(mytype data, searchtree *t)
else
if(data < t->element)
else
if(data > t->element)
else
if(t->lchild && t->rchild)
else
return t;
}//以上**在刪除有兩個子樹的情況效率不高,因為查詢和刪除右子樹中最小的節點遍歷了兩趟。
二叉樹 二叉查詢樹
構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...
二叉樹 二叉查詢樹
二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...
樹(樹,二叉樹,二叉查詢樹)
1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...