演算法4 10 BST平衡二叉樹的刪除操作

2021-06-22 10:11:14 字數 1148 閱讀 1985

public void delete(key key)

這種方法就是將key對應的值覆蓋成null,當讀取該鍵值的時候將會返回null。

這是一種偷懶的辦法,但是在嚴肅的實際應用中肯定不能這樣,一方面會造成記憶體浪費,另一方面效能會越來越慢。

先從簡單的問題開始吧,如何刪掉bst中最小的鍵呢?

先找到最小的鍵,然後將右子節點掛在父節點上。

**:

public void deletemin() 

private node deletemin(node node) else

}

刪除任意節點的時候有三種情況可以考慮:

但是hibbard刪除法在使用一段時間後發現,整個樹變得越來越不平衡。因此hibbard刪除法的平均複雜度是sqrtn。有人提出刪除的時候隨機取出左側或右側的繼承節點。

**:

public void delete(key key) 

private node delete(node node, key key) else if(compare > 0)

// 已定位到對應的節點,開始刪除。以下是沒有子節點或只有1個子節點的情況

if(node.left == null) return node.right;

if(node.right == null) return node.left;

// 有兩個子節點時,採用hibbard刪除法,取出右側最小的節點取代被刪除的節點

node minnode = minnode(node.right);

node.right = deletemin(node.right);

minnode.left = node.left;

minnode.right = node.right;

updatecount(minnode);

return minnode;}

private void updatecount(node node)

private node minnode(node root)

return node;

}

後續章節將會介紹紅黑樹,它能保證所有的操作都能保證logn複雜度。

平衡二叉樹(BST)

二叉排序樹就查詢怎麼比二分便利了?可以是空樹 2.平衡 左子樹結點和右子樹結點的高度差絕對值不能大於1.差 平衡因子 平衡因子 只能為1,0,1 高度 當不平衡時的方法 1.左旋 步驟 將 失衡結點的 右孩子結點 77 替代需平衡結點 66 的位置 右孩子 77 的左子樹 72 變成該節點 66 的...

演算法 平衡二叉樹

題目描述 給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回 true 示例 2 給定二叉樹 1,2,2,3,3,nu...

平衡二叉樹例題 平衡二叉樹

acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...