題目:
分析:
要刪掉二叉搜尋樹中的指定節點,需要找到節點的位置,如果沒有找到就返回空,怎麼找?如果比根節點大,就遍歷右子樹;否則就遍歷左子樹。如果節點的值等於目標值,就找到了要刪掉大的節點
要刪掉的節點找到後有三種情況:
要刪掉的節點有左孩子和右孩子,將左孩子放在右孩子的左孩子的最左邊
步驟:
遞迴三部曲:
函式引數和返回值
函式引數為傳入的根節點和目標值,通過遞迴返回值來將刪掉節點的子節點加入二叉搜尋樹
函式終止的條件
節點為空就返回
單層邏輯
以下五種情況:
*第一種情況: 沒找到刪除的節點,遍歷到空節點就返回找到刪除的節點;
*第二種情況:左右孩子都為空(葉子節點),直接刪除節點, 返回null為根節點
*第三種情況:刪除節點的左孩子為空,右孩子不為空,刪除節點,右孩子補位,返回右孩子為根節點
*第四種情況:刪除節點的右孩子為空,左孩子不為空,刪除節點,左孩子補位,返回左孩子為根節點
*第五種情況:左右孩子節點都不為空,則將刪除節點的左子樹頭結點(左孩子)放到刪除節點的右子樹的最左面節點的左孩子上,返回刪除節點右孩子為新的根節點。
class
solution
cur-
>left = root-
>left;
// 把要刪除的節點(root)左子樹放在cur的左孩子的位置
treenode* tmp = root;
// 把root節點儲存一下,下面來刪除
root = root-
>right;
// 返回舊root的右孩子作為新root
delete tmp;
// 釋放節點記憶體(這裡不寫也可以,但c++最好手動釋放一下吧)
return root;}}
if(root-
>val > key) root-
>left =
deletenode
(root-
>left, key);if
(root-
>val < key) root-
>right =
deletenode
(root-
>right, key)
;return root;}}
;
步驟:
寫乙個函式:deleteone
(1)函式引數為要刪掉的目標節點
(2)函式的返回值為目標節點刪掉後要連線的節點 ,
(3)函式功能:刪掉節點後,找到刪掉節點的父節點的 子節點;
(4)流程:如果節點為空;就返回空;如果右節點為空,就將左子樹返回。否則就將節點的左子樹放在要刪掉節點的右節點的左子樹的最左面節點上。
定義兩個節點,乙個用於記錄要刪掉節點,乙個用於記錄其父節點
判斷父節點是否為空,為空就是刪掉頭節點,函式返回deleteone函式的返回值
判斷父節點的那個子節點要刪掉,確定後,將deleteone函式的返回值掛接到父節點的子節點上。
class
solution
cur-
>left=target-
>left;
return target-
>right;
}public
: treenode*
deletenode
(treenode* root,
int key)
else
if(cur-
>valelse}if
(pre==
null)if
(pre-
>left&&pre-
>left-
>val==key)
else
if(pre-
>right&&pre-
>right-
>val==key)
return root;}}
;
Leetcode 450 刪除二叉搜尋樹中的節點
給定乙個二叉搜尋樹的根節點root和乙個值key,刪除二叉搜尋樹中的key對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 o h h 為樹的高度。示例 r...
Leetcode 450 刪除二叉搜尋樹中的節點
給定乙個二叉搜尋樹的根節點root和乙個值key,刪除二叉搜尋樹中的key對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 o h h 為樹的高度。示例 r...
leetcode450 刪除二叉搜尋樹中的節點
450.刪除二叉搜尋樹中的節點 給定乙個二叉搜尋樹的根節點root和乙個值key,刪除二叉搜尋樹中的key對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 ...