玩轉 二分搜尋樹 lee450 刪除二分搜尋樹節點

2021-10-02 14:52:31 字數 1564 閱讀 4259

給定乙個二叉搜尋樹的根節點 root 和乙個值 key,刪除二叉搜尋樹中的 key 對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹(有可能被更新)的根節點的引用。

一般來說,刪除節點可分為兩個步驟:

首先找到需要刪除的節點;

如果找到了,刪除它。

說明: 要求演算法時間複雜度為 o(h),h 為樹的高度。

示例:root = [5,3,6,2,4,null,7]

key = 3

5
/

3 6/ \

2 4 7

給定需要刪除的節點值是 3,所以我們首先找到 3 這個節點,然後刪除它。

乙個正確的答案是 [5,4,6,2,null,null,7], 如下圖所示。

5
/

4 6/

2 7另乙個正確答案是 [5,2,6,null,4,null,7]。

5
/

2 6\

4 7演算法:

如果 key > root.val,說明要刪除的節點在右子樹,root.right = deletenode(root.right, key)。

如果 key < root.val,說明要刪除的節點在左子樹,root.left = deletenode(root.left, key)。

如果 key == root.val,則該節點就是我們要刪除的節點,則:

如果該節點是葉子節點,則直接刪除它:root = null。

如果該節點不是葉子節點且有右節點,則用它的後繼節點的值替代 root.val = successor.val,然後刪除後繼節點。

如果該節點不是葉子節點且只有左節點,則用它的前驅節點的值替代 root.val = predecessor.val,然後刪除前驅節點。

返回 root。

class

solution

/* one step left and then always right

*/public

intpredecessor

(treenode root)

public treenode deletenode

(treenode root,

int key)

// the node is not a leaf, has no right child, and has a left child

else

}return root;

}}

複雜度分析

時間複雜度:o(logn)。在演算法的執行過程中,我們一直在樹上向左或向右移動。首先先用 o(h 1 ) 的時間找到要刪除的節點,h1z指得是從根節點到要刪除節點的高度。然後刪除節點需要 o(h 2

​ ) 的時間,h_2指的是從要刪除節點到替換節點的高度。由於 (h_1 + h_2) = \mathcal(h)o(h 1+h 2)=o(h),h 值得是樹的高度,若樹是乙個平衡樹則 h = logn。

空間複雜度: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 是否包含該鍵值的結...

二分搜尋樹

template class bst node root intcount public bst bst intsize bool isempty 插入新的節點 public void insert key key,value value private 向以node為根的二叉搜尋樹中,插入節點 k...