二叉搜尋樹

2022-09-02 08:42:08 字數 1741 閱讀 5127

一、二叉搜尋樹的結構

二叉搜尋樹是能夠高效的進行下列操作的資料結構。

1、插入乙個數值

2、查詢是否包含某個數值

3、刪除某個數值

根據實現的不同,還可以實現其他各種各樣的操作,是一種實用性很高的資料結構。二叉搜尋樹如何儲存數值參           見下圖、

二叉搜尋樹的例子

所有的節點,都滿足左子樹上的所有節點都比自己的小,而右子樹上的所有節點都比自己大這一條件。

二叉搜尋樹能夠高效的管理數的集合。例如,可以通過如下方法在上圖的二叉搜尋樹中查詢是否存在10.

1、根節點的數值是7,比10小,所以往右兒子節點走。

2、走到的節點的數值是15,比10大,所以往左兒子節點走。

3、走到的節點是10,因此10在集合中。

接下來,如何往數中插入新的數值呢?

如果我們按照查詢數值的方法試圖查詢這個數值的節點,就可以知道其對應的節點所在位置,之後在那個位置插入新的節點即可。例如,我們需要插入數值6。和查詢的方法類似,從根節點出發,通過「左—》右」兩步,就可以知道6應該是5的右兒子,因此在5的右兒子的位置插入6的節點即可。

最後是刪除數值。數值的刪除比起之前提到的操作稍微麻煩一些。例如,我們要刪除數值15。如果刪除了15所在的節點,那麼他的兩個兒子10和17就懸空了。於是,把11提到15所在的位置就可以解決問題。

一般來說,需要根據下面幾種情況分別進行處理。

1、需要刪除的節點沒有左兒子,那麼就把右兒子提上去。

2、需要刪除的節點的左兒子沒有右兒子,那麼就把左兒子提上去。

3、以上兩種情況都不滿足的話,就把左兒子的子孫中最大的節點提到需要刪除的節點上。

二、二叉搜尋樹的複雜度

不論哪一種操作,所花得時間都和樹的高度成正比。因此,如果共有n個元素,那麼平均每次操作需要o(log n)的時間

三、二叉搜尋樹的實現

node *root = null;

root = =insert(root, 1);

find(root, 1);

//表示節點的結構體

struct node ;

//插入數值x

node *insert(node *p, int x)

else

} //查詢數值x

bool find(node *p, int x)

//刪除數值x

node *remove(node *p, int x)

else if (p->lch->rch == null)

else

return p;

}

下面使用set實現、

#include #include #include using namespace std;

int main()

return 0;

}

下面用map實現

#include #include #include #include using namespace std;

int main()

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...