二叉搜尋樹

2021-09-25 12:03:39 字數 2131 閱讀 4266

1、什麼是二叉搜尋樹

二叉搜尋樹(binary search tree)是一棵有序的二叉樹,所以我們也可以稱它為二叉排序樹(不知道二叉樹的童鞋,先看看二叉樹:傳送門

)。具有以下性質的二叉樹我們稱之為二叉搜尋樹:若它的左子樹不為空,那麼左子樹上的所有值均小於它的根節點;若它的右子樹不為空,那麼右子樹上所有值均大於它的根節點。它的左子樹和右子樹分別也為二叉搜尋樹。

2、二叉搜尋樹的結構

二叉搜尋樹能夠高效的進行一下操作:①插入乙個數值②查詢是否包含某個數值③刪除某個數值

根據實現的不同,還可以實現其他各種操作,這是一種使用性很高的資料結構。我們來看乙個例子:

這就是二叉搜尋樹的儲存結構,所有的節點,都滿足左子樹上的比自己小,而右子樹上的所有節點比自己大。二叉搜尋樹因為其有序性,所以它能夠高效的管理數的集合 

(1)查詢

我們查詢是否存在17:

<1>根節點是7,因為小於17,所以去右子樹查詢

<2>走到節點12,還是小於17,所以繼續往右子樹找

<3> 走到節點17,此時找到17。

(2)插入

我們使用查詢的方式進行插入,以數字6為例,如圖所示:

(3)刪除

刪除操作相對之前的其他兩種操作,就略顯複雜一些。一般來說我們可以分為三種情況:

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

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

<3>不滿足上述的兩種情況的話,就把左子樹中最大的節點放到要刪除的節點上。

3、二叉搜尋樹的複雜度

無論我們執行哪乙個操作,其所花的時間都和樹的高度成正比。我們不難得知,二叉搜尋樹的平均複雜度為o(log n)。

4、二叉搜尋樹的實現

通過上述的了解,我們大致已經知道二叉搜尋樹的工作原理。所以現在我們就來簡單的實現二叉搜尋樹基本的增刪查的功能,**如下:

[cpp]view plain

copy

print?

//表示節點的結構體  

struct node;  

//插入整數x  

node *insert(node *p, int x)else  

return p;  

}  //查詢整數x  

bool find(node *p, int x)  

//刪除整數x  

node *remove(node *p, int x)  

//情況<2>  

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

//情況<3>  

else   

return p;  

}  

//表示節點的結構體

struct node;

//插入整數x

node *insert(node *p, int x)else

return p;

}//查詢整數x

bool find(node *p, int x)

//刪除整數x

node *remove(node *p, int x)

//情況<2>

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

//情況<3>

else

return p;

}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 解釋 輸入為 ...