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