您好,登錄后才能下訂單哦!
如何刪除二叉樹中的節(jié)點(diǎn),相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
算法:
1.后驅(qū)算法:
/*遞歸解法:1.找到需要?jiǎng)h除的節(jié)點(diǎn)2.刪除的節(jié)點(diǎn)只有右子樹或者左子樹,直接將右子樹或者左子樹的根節(jié)點(diǎn)當(dāng)作這個(gè)刪除的節(jié)點(diǎn)3.刪除的節(jié)點(diǎn)左右子樹都存在的情況下,左子樹的最大節(jié)點(diǎn)也叫做前驅(qū)當(dāng)作刪除節(jié)點(diǎn),或者將右子樹的最小節(jié)點(diǎn)也就稱作后驅(qū)當(dāng)作刪除節(jié)點(diǎn)。*/
2.前驅(qū)算法:
/*遞歸解法:1.找到需要?jiǎng)h除的節(jié)點(diǎn)2.刪除的節(jié)點(diǎn)只有右子樹或者左子樹,直接將右子樹或者左子樹的根節(jié)點(diǎn)當(dāng)作這個(gè)刪除的節(jié)點(diǎn)3.刪除的節(jié)點(diǎn)左右子樹都存在的情況下,左子樹的最大節(jié)點(diǎn)也叫做前驅(qū)當(dāng)作刪除節(jié)點(diǎn),或者將右子樹的最小節(jié)點(diǎn)也就稱作后驅(qū)當(dāng)作刪除節(jié)點(diǎn)。*/
題目:
后驅(qū)算法:
func deleteNode(root *TreeNode, key int) *TreeNode { if root == nil { return nil } if key < root.Val { root.Left = deleteNode(root.Left,key) return root } if key > root.Val { root.Right = deleteNode(root.Right,key) return root } // 這里通過遞歸已經(jīng)找到了要?jiǎng)h除的節(jié)點(diǎn),此時(shí)因?yàn)檫f歸的原因還是root這個(gè)指針 if root.Right == nil { return root.Left } if root.Left == nil { return root.Right } // 后驅(qū)的方法來替換當(dāng)前節(jié)點(diǎn) min := root.Right for min.Left != nil { min = min.Left } root.Val = min.Val // 替換需要?jiǎng)h除的節(jié)點(diǎn)的數(shù)值,這里就是復(fù)制 root.Right = deleteMin(root.Right) // 這里把右子樹中移動(dòng)過來的那個(gè)最小節(jié)點(diǎn)刪除掉 return root}func deleteMin(root *TreeNode) *TreeNode{ // 左子樹不在的話,表示這個(gè)節(jié)點(diǎn)就是要?jiǎng)h除的最小節(jié)點(diǎn) // 存在兩種情況,一:這個(gè)節(jié)點(diǎn)就是葉子節(jié)點(diǎn),直接通過賦值為nil, 來當(dāng)作刪除節(jié)點(diǎn)。 // 二:這個(gè)節(jié)點(diǎn)沒有左子樹,只有右子樹,這樣的話,需要將右子樹替換成該節(jié)點(diǎn) if root.Left == nil { right := root.Right root.Right = nil return right } root.Left = deleteMin(root.Left) // 左子樹一直在的話,就一直通過左子樹去找最小節(jié)點(diǎn) return root}
前驅(qū)算法
func deleteNode(root *TreeNode, key int) *TreeNode {
if root == nil {
return nil
}
if key < root.Val {
root.Left = deleteNode(root.Left,key)
return root
}
if key > root.Val {
root.Right = deleteNode(root.Right,key)
return root
}
// 這里通過遞歸已經(jīng)找到了要?jiǎng)h除的節(jié)點(diǎn),此時(shí)因?yàn)檫f歸的原因還是root這個(gè)指針
if root.Right == nil {
return root.Left
}
if root.Left == nil {
return root.Right
}
// 前驅(qū)的方法來替換當(dāng)前節(jié)點(diǎn)
max := root.Left
for max.Right != nil {
max = max.Right
}
root.Val = max.Val
root.Left = deleteMax(root.Left)
return root
}
func deleteMax(root *TreeNode) *TreeNode {
if root.Right == nil {
left := root.Left
root.Left = nil
return left
}
root.Right = deleteMax(root.Right)
return root
}
/*
遞歸解法:
1.找到需要?jiǎng)h除的節(jié)點(diǎn)
2.刪除的節(jié)點(diǎn)只有右子樹或者左子樹,直接將右子樹或者左子樹的根節(jié)點(diǎn)當(dāng)作這個(gè)刪除的節(jié)點(diǎn)
3.刪除的節(jié)點(diǎn)左右子樹都存在的情況下,左子樹的最大節(jié)點(diǎn)也叫做前驅(qū)當(dāng)作刪除節(jié)點(diǎn),
或者將右子樹的最小節(jié)點(diǎn)也就稱作后驅(qū)當(dāng)作刪除節(jié)點(diǎn)。
*/
看完上述內(nèi)容,你們掌握如何刪除二叉樹中的節(jié)點(diǎn)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。