二叉查詢樹

2021-10-12 14:39:54 字數 2872 閱讀 9329

分析**

二叉查詢樹是一種能夠將鍊錶插入的靈活性和有序陣列查詢的高效性結合起來的符號表實現。二叉查詢樹得以廣泛應用的乙個重要原因是它能夠保持鍵的有序性,因此它可以作為實現有序符號表 api 中眾多方法的基礎,這是電腦科學中最重要的演算法之一。

一棵二叉查詢樹(bst)是一棵二叉樹,其中每個節點都含有乙個 comparable 的鍵(以及相關聯的值),且每個節點的鍵都大於其左子樹中的任意節點的鍵而小於右子樹的任意節點的鍵

和鍊錶一樣,在類中定義乙個私有結構體來表示二叉查詢樹的乙個節點,每個節點都含有乙個鍵、乙個值、一條左鏈結、一條右鏈結和乙個節點計數器。左鏈結指向一棵由小於該節點的所有鍵組成的二叉查詢樹,右鏈結指向一棵由大於該節點的所有鍵組成的二叉查詢樹。

一棵二叉查詢樹代表了一組鍵(及其相應的值)的集合,而同乙個集合可以用多棵不同二點二叉查詢樹表示。

struct node

};

我們很容易想到用遞迴的形式來進行查詢。一般來說,在符號表中查詢乙個鍵可能得到兩種結果,如果含有該鍵的節點在表中,就命中,然後返回相應的值。否則查詢未命中,返回 nullptr。如果樹是空的,則查詢未命中,如果被查詢的鍵和根節點的鍵相等,查詢命中,如果被查詢的鍵較小,選擇左子樹,較**擇右子樹。

value get

(node *x, key key)

如果樹是空的,就返回乙個含有該鍵值對的新節點,如果被查詢的鍵小於根節點的鍵,我們會繼續在左子樹中插入該鍵,如果被查詢的鍵大於根節點的鍵,就在右子樹中插入該鍵,如果相等,則更新值。並增加路徑上每個節點中計數器的值。

node*

put(node* x, key key, value val)

二叉查詢樹中最複雜的方法就是刪除操作,即從符號表中刪除乙個鍵值對。

首先考慮刪除最小鍵所對應的鍵值對。我們需要不斷深入根節點的左子樹直到遇見乙個空鏈結,然後將指向該節點的鏈結指向該節點的右子樹。

刪除的基本思想:刪除節點 x 後用它的後繼節點填補它的位置。

將指向即將被刪除的節點的鏈結儲存為 t ;

將 x 指向它的後繼節點 min(t.right) ;

將 x 的右鏈結指向 deletemin(t.right),也就是在刪除後所有節點仍然都大於 x.key 的子二叉查詢樹

將 x 的左鏈結設為 t.left

node*

min(node* x)

node*

deletemin

(node* x)

node*

deletebykey

(node* x, key key)

x->n =

size

(x->left)

+size

(x->right)+1

;return x;

}

得益於二叉查詢樹的有序性,我們可以返回特定位置的鍵。

node*

select

(node *x,

int k)

使用二叉查詢樹的演算法的執行時間卻決於樹的形狀,而樹的形狀又取決於鍵被插入的先後順序。在最好的情況下,一棵含有 n 個節點的樹是完全平衡的,每條空鏈結和根節點的距離都為 lgn ,在最壞的情況下,搜尋路徑上可能有 n 個節點,但在一般情況下樹的形狀和最好情況更接近。

在由 n 個隨機鍵構成的二叉查詢樹中,查詢和插入平均所需的比較次數為 ~2lnn (約為1.39 lgn)

在一棵二叉查詢樹中,所有操作在最壞情況下所需的時間都和樹的高度成正比

隨機構造的樹中所有路徑長度都小於 3lgn

二叉查詢樹的基本實現的良好效能依賴於其中的鍵的分布足夠隨機以消除長路徑

如果構造樹的鍵不是隨機的怎麼辦?下一節介紹平衡二叉查詢樹。

template

<

typename key,

typename value>

class

bst}

; node *root =

nullptr

;int

size

(node *x)

value get

(node *x, key key)

node*

put(node* x, key key, value val)

node*

min(node* x)

node*

select

(node *x,

int k)

node*

deletemin

(node* x)

node*

deletebykey

(node* x, key key)

x->n =

size

(x->left)

+size

(x->right)+1

;return x;

}public

:int

size()

value get

(key key)

void

put(key key, value val)

key min()

key select

(int k)

void

deletemin()

void

deletebykey

(key key)

};

二叉樹 二叉查詢樹

構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 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 ...