温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何删除二叉树中的节点

发布时间: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