/**
* 二叉搜尋樹的刪除一般分為三種情況;
* 1. 要刪除的節點本身是葉子結點 -> 直接刪除
* 2. 要刪除的節點本身只有乙個孩子節點 -> 用孩子節點替換他
* 3. 要刪除的節點本身有兩個孩子節點 -> 找到該節點a 的後繼節點(比該節點大的最小節點,也就是右子樹的最左葉子結點)b 然後用b替換a 最後再右子樹中刪除b(又可以分為 1、2 按對應的情況處理即可)
** @param root
* @param value
* @return
*/public treenode
delete
(treenode
root, integer value)
//如果根節點大於目標值,則該值所處節點在根節點的左子
if(root.value > value)
//如果根節點小於目標值,則該值所處節點在根節點的右子樹
else
if(root.value < value)
//如果根節點等於目標值,則該值就在根節點
else
//該節點沒有右子樹
if(root.rightnode == null)
//此時左子樹和右子樹都不為空,則去找後繼節點
treenode
minnext =
findsuccessor
(root.rightnode)
;//將要刪除節點的值替換為後繼節點的值
root.value = minnext.value;
//刪除後繼節點
root.rightnode =
delete
(root.rightnode, root.value);}
return root;
}/**
* 尋找後繼節點
* @param root
* @return
*/public treenode
findsuccessor
(treenode
root)
return root;
}
二叉搜尋樹 刪除節點
前幾天寫了簡單的二叉排序樹的實現,僅僅提供了插入和查詢操作,沒有寫刪除給定節點操作。現在補充過來,不過這個代價似乎太大了點 二叉排序樹的刪除操作主要有兩點要注意 1 必須修改的是刪除節點父節點的資訊 2 有四種情況需要考慮 刪除節點有無左右子樹的 4個組合 再加上一點就是要細心,考慮各種情況,例如根...
二叉搜尋樹c 資料結構二叉搜尋樹
在n個動態的整數中搜尋某個整數?檢視其是否存在 假設使用動態陣列存放元素,從第 0 個位置開始遍歷搜尋,平均時間複雜度 o n 如果維護乙個有序的動態陣列,使用二分搜尋,最壞時間複雜度 o logn 但是新增 刪除的平均時間複雜度是 o n 針對這個需求,有沒有更好的方案?今天我們主要講的就是二叉搜...
二叉搜尋樹 刪除二叉搜尋樹中的節點
這裡就把平衡二叉樹中刪除節點遇到的情況都搞清楚。第一種情況 沒找到刪除的節點,遍歷到空節點直接返回了 找到刪除的節點 第二種情況 左右孩子都為空 葉子節點 直接刪除節點,返回null為根節點 第三種情況 刪除節點的左孩子為空,右孩子不為空,刪除節點,右孩子補位,返回右孩子為根節點 第四種情況 刪除節...