示例:
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
思路分析:這題不難,就是需要頭腦清晰。
|如果需要刪除的節點是當前樹的root,
| |如果root->right == null,則返回的結果是root->left
| |否則我們需要從root->right尋找到最小的節點tempptr,並把它從root->right割下來,然後root->left放到tempptr->left,root->right放到tempptr->right
|否則我們利用二叉搜尋樹的性質找需要刪除的節點位置以及它的父節點,遞迴呼叫自己,刪除那個節點,返回拼接好的子樹,放回到父節點對應的位置。
比如示例的處理,首先判斷root->val == val,不等於,則將root修改為key對應的位置,beforedel修改為key對應節點的父節點。
然後自己呼叫自己,當前root(5的左節點3)就是需要刪除節點,刪除key(5的左節點)前,修改當前root的left和right。
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
//否則一直沿left尋找
while
(root-
>left-
>left)
//將這個節點從樹中割下
res = root-
>left;
root-
>left = root-
>left-
>right;
//將之前的最初始的root放到這個節點的右端
res-
>right = start;
return res;
} treenode*
deletenode
(treenode* root,
int key)
//處理特殊情況,刪除root
treenode *result = root;
if(root-
>val == key)
else
delete root;
return result;
}//定位到需要刪除的節點
treenode *beforedel = root;
//需要刪除節點的父節點
while
(root != null && root-
>val != key)
else
}//遞迴呼叫自己,刪除當前的root
二叉搜尋樹 二叉搜尋樹的刪除操作
如圖刪除 7,4,2直接刪除接可以 如圖 刪除6把7拉上去 如圖 刪除3 4沒有左孩子直接返回4 所以最後的結果只是4覆蓋3 上 class solution if key root.val else if key root.val else else if root.right null else...
二叉搜尋樹 刪除二叉搜尋樹中的節點
這裡就把平衡二叉樹中刪除節點遇到的情況都搞清楚。第一種情況 沒找到刪除的節點,遍歷到空節點直接返回了 找到刪除的節點 第二種情況 左右孩子都為空 葉子節點 直接刪除節點,返回null為根節點 第三種情況 刪除節點的左孩子為空,右孩子不為空,刪除節點,右孩子補位,返回右孩子為根節點 第四種情況 刪除節...
leetcode 二叉樹 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true 示例 2 輸入 5 1 4 3 6 輸出 false 解釋 ...