leetcode450 刪除二叉搜尋樹中的節點

2021-10-03 23:17:44 字數 2187 閱讀 6588

給定乙個二叉搜尋樹的根節點 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的右子樹直接代替key,然後把key原來的左子樹,放在這個右子樹的最左側端點處,也就是最小的節點的左節點.保證二叉搜尋樹的性質不變.

我的這個演算法雖然看著麻煩,但是時間複雜度也是樹的高度.

class

solution

else

tmp.left=root.left;

}return newroot;

}find

(root,key);if

(keynodep==null)

return root;

//樹裡面並沒有key

if(keynodep.left==keynode)

else

tmp.left=keynode.left;}}

else

else

tmp.left=keynode.left;}}

return root;

}public treenode keynodep=null;

public treenode keynode=null;

public

void

find

(treenode root,

int key)

else

if(root.right!=null&&root.right.val==key)

else

if(keyelse

if(key>root.val)

}}

遞迴刪除二叉搜尋樹中的節點

這是我看到的**比較簡潔的了

public treenode deletenode

(treenode root,

int key)

else

//在右子樹上刪除node節點

if(parent.left == node) parent.left = node.right;

if(parent.right == node) parent.right = node.right;

//將node節點放在key節點位置上

node.left = root.left;

node.right = root.right;

return node;}}

else

if(root.val < key)

else

return root;

}

個人感覺這種遞迴還是不好想,雖然他已經夠簡單了.

leetcode 50/100

Leetcode 450 刪除二叉搜尋樹中的節點

給定乙個二叉搜尋樹的根節點root和乙個值key,刪除二叉搜尋樹中的key對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 o h h 為樹的高度。示例 r...

Leetcode 450 刪除二叉搜尋樹中的節點

給定乙個二叉搜尋樹的根節點root和乙個值key,刪除二叉搜尋樹中的key對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 o h h 為樹的高度。示例 r...

leetcode450 刪除二叉搜尋樹中的節點

450.刪除二叉搜尋樹中的節點 給定乙個二叉搜尋樹的根節點root和乙個值key,刪除二叉搜尋樹中的key對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 ...