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 解釋 輸入為 ...