6 樹 二叉搜尋樹

2021-08-03 08:57:11 字數 1540 閱讀 5626

二叉搜尋樹(bst, binary search tree),也稱二叉排序樹或二叉查詢樹

二叉搜尋樹:一棵二叉樹,可以為空;如果不為空,滿足以下性質:

非空左子樹的所有鍵值小於其根結點的鍵值

非空右子樹的所有鍵值大於其根結點的鍵值

左、右子樹都是二叉搜尋樹

bintree insert(elementtype x, bintree bst)bintree delete(elementtype x, bintree bst)遞迴實現

position find(elementtype x, bintree bst)
迭代實現

由於非遞迴函式的執行效率高,可將「尾遞迴」函式改為迭代函式

position iterfind(elementtype x, bintree bst) 

return null; // 查詢失敗

}

查詢的效率決定於樹的高度

實現查詢最小元素的遞迴函式

position findmin(bintree bst)
查詢最大元素的迭代函式

position findmax(bintree bst) 

return bst;

}

關鍵是要找到元素應該插入的位置,可以採用與find類似的方法

實現

bintree insert(elementtype x, bintree bst)  else 

return bst;

}

需要考慮三種情況:

* 要刪除的是葉結點:直接刪除,並修改其父結點指標—置為null

* 要刪除的結點只有乙個孩子結點:將其父結點的指標指向要刪除結點的孩子結點

* 要刪除的結點有左右兩棵子樹:用另一結點替代被刪除的結點

* 右子樹的最小元素

* 左子樹的最大元素

實現

bintree delete(elementtype x, bintree bst) 

if (x < bst->data)

bst->left = delete(x, bst->left); // 左子樹遞迴刪除

else

if (x > bst->data)

bst->right = delete(x, bst->right); // 右子樹遞迴刪除

else else

}return bst;

}

二叉搜尋樹 二叉搜尋樹

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