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