二叉搜尋樹

2021-08-15 23:38:31 字數 1713 閱讀 7664

搜尋比較  : 陣列的搜尋比較方便 ,可以直接使用下標,但是刪除或者插入某些元素就比較麻煩了

鍊錶  : 刪除插入快,查詢慢

二叉搜尋樹處理大量動態資料比較有用

二叉搜尋樹的基本概念:每個節點比他的左子樹的任意節點大,而且比它右子樹的任意節點小。二叉搜尋樹沿著乙個路徑,直到找到資料或nil值。

基本概念:

1.根(root):樹中最頂端的節點,根沒有父節點。

2.子節點(child):節點所擁有子樹的根節點稱為該節點的子節點。

3.前驅結點:結點val值小於該節點值並且值最大的節點。

4.後繼節點:節點val值大於節點val值並且值最小的節點。

二叉搜尋樹的尋找值得兩種實現方法:

查詢過程從根節點開始:如果值與節點的值相同則命中,如果不同,搜尋的值比節點的值大,則進入他的右子樹,比節點的值小則進入左子樹,如果左邊或右邊的指標為空,則報告沒有找到。

遞迴實現:

tree_search(x,k);

if x == nil or x.key == k:

return x;

if k < x.key:

return tree_search(x.left,k)

else:

return tree_search(x.right,k)

非遞迴迭代實現(這個比遞迴實現的方法效率更高)

tree_search(x,k):

while x != nil and k != x.key:

if k < x.key:

x = x.left

else:

x = x.right

return x

前序遍歷:61532479810

中序遍歷:12345678910

4 的前驅是3;2的前驅是1;6的前驅是5;7的後繼是8,5的後繼是6;2的後繼是3

中序遍歷一下,就知道哪個是哪個的前驅,哪個是哪個的後繼了。

前驅節點:

1.若乙個節點有左子樹,那麼該節點的前驅節點是其左子樹中val值最大的節點

2.若乙個節點沒有左子樹,那麼判斷該節點和其父節點的關係:

a.該節點是其父節點的右子樹,那麼該節點的前驅節點即為父節點。

b.若該節點是其父節點的左子樹,那麼需要沿著其父節點一直向樹的頂端尋找,知道找到乙個節點p,p節點是其父節點q的右孩子,那麼q就是該節點的前驅節點。

後繼節點:

1.若乙個節點有右子樹,那麼該節點的後繼節點是其右子樹中,val值最小的節點。

2.若乙個節點沒有右子樹:

a.該節點是其父節點的左邊孩子

b.該節點是其父節點的右孩子

bst 插入:

當需要乙個新節點時,從根節點開始,迭代或者遞迴向下移動直到遇到乙個空的指標nil,需要插入的值被儲存在該節點的位置。

bst刪除比插入複雜:

1.如果節點z沒有孩子節點,那麼只需要簡單將其刪除,並修改父節點,用nil來代替z。

2.節點z只有乙個孩子,那麼僵這個孩子節點提公升到z節點的位置,並修改z的父節點,用z的子節點替換z;

3.如果節點z有兩個子節點,那麼查詢z的後繼y後繼一定在的右子樹中,然後讓那個y替換z.

二叉搜尋樹 二叉搜尋樹

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