中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何刪除二叉樹中的節點

發布時間:2021-11-20 09:30:11 來源:億速云 閱讀:436 作者:柒染 欄目:大數據

如何刪除二叉樹中的節點,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

算法:

1.后驅算法:

/*遞歸解法:1.找到需要刪除的節點2.刪除的節點只有右子樹或者左子樹,直接將右子樹或者左子樹的根節點當作這個刪除的節點3.刪除的節點左右子樹都存在的情況下,左子樹的最大節點也叫做前驅當作刪除節點,或者將右子樹的最小節點也就稱作后驅當作刪除節點。*/

2.前驅算法:

/*遞歸解法:1.找到需要刪除的節點2.刪除的節點只有右子樹或者左子樹,直接將右子樹或者左子樹的根節點當作這個刪除的節點3.刪除的節點左右子樹都存在的情況下,左子樹的最大節點也叫做前驅當作刪除節點,或者將右子樹的最小節點也就稱作后驅當作刪除節點。*/

題目:

如何刪除二叉樹中的節點

后驅算法:

如何刪除二叉樹中的節點

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    }    // 這里通過遞歸已經找到了要刪除的節點,此時因為遞歸的原因還是root這個指針    if root.Right == nil {        return root.Left    }    if root.Left == nil {        return root.Right    }    // 后驅的方法來替換當前節點    min := root.Right    for min.Left != nil {        min = min.Left    }    root.Val = min.Val // 替換需要刪除的節點的數值,這里就是復制    root.Right = deleteMin(root.Right) // 這里把右子樹中移動過來的那個最小節點刪除掉    return root}func deleteMin(root *TreeNode) *TreeNode{    // 左子樹不在的話,表示這個節點就是要刪除的最小節點    // 存在兩種情況,一:這個節點就是葉子節點,直接通過賦值為nil, 來當作刪除節點。    // 二:這個節點沒有左子樹,只有右子樹,這樣的話,需要將右子樹替換成該節點    if root.Left == nil {         right := root.Right        root.Right = nil         return right    }    root.Left = deleteMin(root.Left) // 左子樹一直在的話,就一直通過左子樹去找最小節點    return root}

前驅算法

如何刪除二叉樹中的節點

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    }    // 這里通過遞歸已經找到了要刪除的節點,此時因為遞歸的原因還是root這個指針    if root.Right == nil {        return root.Left    }    if root.Left == nil {        return root.Right    }    // 前驅的方法來替換當前節點    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.找到需要刪除的節點2.刪除的節點只有右子樹或者左子樹,直接將右子樹或者左子樹的根節點當作這個刪除的節點3.刪除的節點左右子樹都存在的情況下,左子樹的最大節點也叫做前驅當作刪除節點,或者將右子樹的最小節點也就稱作后驅當作刪除節點。*/

看完上述內容,你們掌握如何刪除二叉樹中的節點的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

民乐县| 武强县| 景谷| 同心县| 呼玛县| 德惠市| 清水河县| 花莲县| 宣汉县| 冕宁县| 安吉县| 黎城县| 徐州市| 芦山县| 延边| 苏尼特左旗| 新宾| 乌苏市| 乌审旗| 石门县| 灵宝市| 周宁县| 黑山县| 广宗县| 阿合奇县| 玛曲县| 泸溪县| 衡山县| 南涧| 那坡县| 蛟河市| 噶尔县| 克东县| 水富县| 永泰县| 九寨沟县| 禹城市| 榆中县| 高雄市| 翁牛特旗| 卢氏县|