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兩種狀態,省...