搜尋比較 : 陣列的搜尋比較方便 ,可以直接使用下標,但是刪除或者插入某些元素就比較麻煩了
鍊錶 : 刪除插入快,查詢慢
二叉搜尋樹處理大量動態資料比較有用
二叉搜尋樹的基本概念:每個節點比他的左子樹的任意節點大,而且比它右子樹的任意節點小。二叉搜尋樹沿著乙個路徑,直到找到資料或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 解釋 輸入為 ...