移除最小元素節點:首先我們知道,二分搜尋樹的結構是每乙個節點的左子樹值都比該節點小,右子樹的值都比該節點大,所以,一顆二分搜尋樹的最小元素節點必定在他的最左端節點。相同的,一顆二分搜尋樹的最大元素節點必定在他的最右端節點,
刪除最小元素節點:
我們只需要先找到該樹的最左端元素節點
判斷該節點有沒有右子樹,如果有,則將其右子樹先儲存起來,再將其從二分搜尋樹斷開,,最後返回該右子樹節點(返回該右子樹節點後,會將該右子樹與二分搜尋樹連線起來),此時我們便將最小元素節點從二分搜尋樹上安全的斷開了
public e removemin()
//尋找最小元素節點
//返回刪除節點後新的二分搜尋樹的根
private node removemin(node node)
//語義:對node的左子樹進行刪除最小元素的值,並將執行結果返回給node的左子樹
//這句話是整個刪除操作中比較精髓的一段**了
node.left = removemin(node.left);
//最後,返回進行刪除操作的根節點
return node;
}//尋找最小元素節點,返回最小元素的值
public e minmum()
node minnode = minmum(root);
return minnode.e;
}//真正尋找最小元素的方法
private node minmum(node node)
刪除最大的元素節點與刪除最小元素節點在操作上相反,這裡就不在贅述。
測試:
//bst是我自己寫的二分搜尋樹的類,大同小異
//測試方法可以參考一下,有問題可以指出,一起進步,哈哈哈哈
bstb = new bst<>();
random random = new random();
int n = 10000;
//將隨機數加入二分搜尋書中
for(int i = 0;i < n;i++)
b.add(random.nextint(n));
linkedlistlist = new linkedlist<>();
//每次將刪除的最小值放入linkedlist中,
while(!b.isempty())
list.add(b.removemin());
//比較linkedlist中存放的元素是否為公升序的
for(int i = 1;i < list.size();i++)
if(list.get(i-1) > list.get(i))
system.out.println("刪除最小值方法測試成功!!!");
執行結果:
玩轉 二分搜尋樹 lee450 刪除二分搜尋樹節點
給定乙個二叉搜尋樹的根節點 root 和乙個值 key,刪除二叉搜尋樹中的 key 對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 o h h 為樹的高度...
二分搜尋樹
1.二分搜尋樹 binary search tree 性質 a.二分搜尋樹是二叉樹 b.二分搜尋樹的每乙個節點的值 大於其左子樹的所有節點的值 小於其右子樹的所有節點的值 c.每一顆子樹也是二分搜尋樹 e.儲存的元素必須具有可比較性 二分搜尋樹的乙個缺點 2.二分搜尋樹的操作 a.二分搜尋樹新增新元...
二分搜尋樹
include include include include include using namespace std templateclass bst bst int size bool isempty 插入結點 void insert key key,value value 是否包含該鍵值的結...