資料結構之 二叉查詢樹(C語言實現)

2021-07-29 17:00:16 字數 1677 閱讀 9212

二叉查詢樹(binary search tree)是一棵二叉樹,或稱為二叉搜尋樹,可能為空;一棵非空的二叉查詢樹滿足一下特徵:

每個元素有乙個關鍵字,並且任意兩個元素的關鍵字都不同;因此,所有的關鍵字都是唯一的。

在根節點的左子樹中,元素的關鍵字(如果存在)都是小於根節點的關鍵字。

在根節點的右子樹中,元素的關鍵字(如果存在)都是大於根節點的關鍵字。

根節點的左、右子樹也都是二叉查詢樹

二叉查詢樹是基於乙個二叉樹滿足以上特徵所實現的,因此關於二叉樹的操作實現的博文:二叉樹(c語言實現)

typedef

int mytype;

typedef

struct treenode

searchtree;

遞迴查詢關鍵字為data的元素,時間複雜度為o(h),h是樹的高度

searchtree *find(mytype data, searchtree *t)

根據二叉查詢樹的性質,遍歷左子樹。

searchtree *findmin(searchtree *t)

根據二叉查詢樹的性質,遍歷右子樹。

searchtree *findmax(searchtree *t)

如果data不存在,則插入,根據二叉查詢樹的性質,如果大於根節點元素,進入右子樹,如果小於根節點元素則進入左子樹。

searchtree *insert(mytype data, searchtree *t)

else

if (data

< t->element) else

if (data

> t->element)

return t;

}

刪除操作有三種情況

t是葉子節點。直接釋放該節點的空間,如果是根節點,則直接賦值為null。

t有一棵非空子樹。如果是根節點,則t的唯一子樹成為根節點,如果非根節點,則使其父節點指標繞過該節點指向其唯一子節點,釋放空間。

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;

}//以上**在刪除有兩個子樹的情況效率不高,因為查詢和刪除右子樹中最小的節點遍歷了兩趟。

以上關於二叉查詢樹的操作時間複雜度均為o(lo

g2n )。

資料結構之二叉查詢樹

針對二叉查詢樹的操作 增刪改查 的時間和樹的高度成正比,比如都有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的右子樹的乙個結點,則 ...