二叉搜尋樹介紹及其介面說明

2022-09-15 12:57:11 字數 3099 閱讀 6089

二叉搜尋樹是由二叉樹組成專用於查詢和搜尋目的的一種資料結構。

如下圖1所示,要找出樹中值為15的結點,從根結點開始,因為15比20小,往20的左結點移動。移動到結點值為9的左子結點上,因為15又比9大,所以往9的右結點移動,此時的結點值恰好是15,於是就找到了所需要的目標結點。

當然,搜尋乙個二叉樹的過程依賴於其結點都是按照類似的方式插入的。因此,要插入乙個結點,也是從根結點開始,一層層往下,適當地移動到左或右子結點上,當到達分支的盡頭時,執行插入操作。不允許插入重複的結點值

如下圖1所示,將值65的結點插入到樹中,從根結點開始,因為65比20大,所以向20的右子結點移動。移動到53,又因為65比53大,所以還是向右移動。移動到79,因為65比79小,所以向79的左子結點移動,此時79已經是樹的分支盡頭了,因此將待插入的結點插入到79對應的左子結點上。插入結束。

二叉搜尋樹是一種用於查詢操作的高效資料結構,因為在最壞的情況下,只需要查詢乙個分支上的資料就可以了,而不用檢索每乙個資料。因此,查詢的複雜度是o(lg n), 這裡的n代表樹中的結點的個數。這裡樹必須是保持平衡的(對於給定資料的結點,要使樹的高度盡可能的短)。保持二叉搜尋樹處於平衡狀態是非常重要的,因為這代表著我們查詢的分支都不會特別長。

二叉搜尋樹的介面包括初始化、銷毀、插入、移除、查詢和樹的大小等操作。

bistree_init

void bistree_init(bistree *tree, void (*compare)(const void *key1,const void *key2),void (*destroy)(void *data));

返回值:無

描述初始化由引數tree所指定的二叉搜尋樹

該函式必須在其他操作執行前呼叫。函式指標compare指定乙個由使用者定義的比較函式。這個比較函式在key1大於key2時返回1,key1小於key2時返回-1,當key1等於key2時返回0。當呼叫bistree_destroy時,由destroy所指定的析構函式提供了一種釋放動態分配的空間的方法。它的工作方式同前面描述過的bitree_destroy類似。如果二叉搜尋樹包含的資料不需要釋放,則destroy應該設定為null。

複雜度:o(1)

bistree_destroy

void bistree_init(bistree *tree);

返回值:無

描述銷毀由引數tree所指定的二叉搜尋樹

呼叫該函式後其他任何操作都不允許再執行,除非重新呼叫bistree_init。bistree_destroy將二叉搜尋樹中所有的結點都移除。如果傳給bistree_init的引數destroy不為null的話,則每次移除結點時都需要呼叫由destroy所指定的析構函式。

複雜度:o(n),這裡n代表二叉搜尋樹中的結點個數。

bistree_insert

int bistree_insert(bistree *tree, const void *data);

返回值:如果插入操作成功,返回0;如果待插入結點已經在樹中存在,返回1;否則返回-1。

描述將結點插入由引數tree所指定的二叉搜尋樹中

新結點包含乙個指向引數data的指標,因此只要該結點還在樹中,data所引用的記憶體空間就必須保持有效。由呼叫者負責管理data所關聯的記憶體空間。

複雜度:o(lg n),這裡n代表二叉搜尋樹中的結點個數。

bistree_remove

int bistree_remove(bistree *tree, const void *data);

返回值:如果移除操作成功返回0;否則返回-1。

描述在由引數tree所指定的二叉搜尋樹中,移除資料同引數data相吻合的結點

實際上該操作僅僅只執行一種惰性移除,即該結點只是簡單的標識為隱藏。

因此,並不會返回指向結點資料的指標。更進一步的是,樹中的資料就算被移除了也必須保持有效。其結果就是,二叉搜尋樹的大小,即bistree_size的返回值,並不會在移除乙個結點後遞減。

複雜度:o(lg n),這裡n代表二叉搜尋樹中的結點的個數。

bistree_lookup

int bistree_lookup(const bistree *tree, void **data);

返回值:如果成功查詢到結點,返回0;否則返回-1。

描述判斷由引數tree所指定的二叉搜尋樹中是否存在資料同引數data相吻合的結點

如果查詢操作成功,則函式返回後引數data指向查詢到結點的資料。

複雜度:o(lg n),這裡n代表二叉搜尋樹中的結點的個數。

bistree_size

int bistree_lookup(const bistree *tree);

返回值:二叉樹中的結點的個數。

描述這是乙個巨集,用來計算由引數tree所指定的二叉搜尋樹中的結點的個數。

複雜度:o(1)

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹簡單介紹

2.最大關鍵字元素和最小關鍵字元素 2.插入和刪除 2.刪除 1.概述 一棵二叉搜尋樹是以一棵二叉樹組織的,其中每個結點就是乙個物件,每個節點包含屬性left right p,它們分別指向結點的左孩子,右孩子和雙親,如果某個結點的孩子的屬性值不在,則為nil。對任何結點x,x左子樹中的關鍵字最大不超...

二叉搜尋樹開始部分 驗證二叉搜尋樹 附帶介紹

每個節點中的值必須大於儲存在其左側子樹中的任何值。每個節點中的值必須小於儲存在其右子樹中的任何值。首先二叉搜尋樹有個特性即它的中序遍歷為乙個遞增的有序序列那麼我們就可以利用這個特性來驗證二叉搜尋樹,我們只要判斷list.get i 1 list.get i 就可以判斷不是二叉搜尋樹,如果迴圈完畢則是...