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

2021-10-08 16:16:04 字數 1707 閱讀 2898

給定乙個二叉搜尋樹的根節點 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先是在二叉樹上搜尋,思路和過程與leetcode 700: search in a binary search tree類似,主要解決的是如果找到目標節點,如何刪除才能保證二叉搜尋樹原有性質不變,應考慮以下情況:

1. 目標節點沒有子節點,則直接刪除

2. 目標節點存只存在右子節點,為保持二叉搜尋樹性質,用右子節點代替當前節點

3. 目標節點存在左子節點,為保持二叉搜尋樹性質,應當將其右子節點改為其左子樹的最右邊節點(即左子樹最大值對應節點)的右子節點,然後將目標節點的左子節點代替當前節點。

實際上1、2可以合併為:不存在左子節點的情況時,用右子節點代替當前節點。

迭代

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

root->val = cur_node->right->val;

cur_node->right = cur_node->right->left;

}else

return root;

}else

return root->right;}if

(root->val > key) root->left =

deletenode

(root->left, key)

;else root->right =

deletenode

(root->right, key)

;return root;}}

;

迴圈

這裡建立了個根節點的父節點:pre_root,用於解決目標節點恰好為根節點的情況。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

else}if

(cur_node ==

null

)return root;

if(cur_node->left ==

null

)else

return pre_root->right;}}

;

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

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

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

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

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

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