如何删除二叉树中的节点,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
算法:
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.删除的节点左右子树都存在的情况下,左子树的最大节点也叫做前驱当作删除节点,
或者将右子树的最小节点也就称作后驱当作删除节点。
*/
看完上述内容,你们掌握如何删除二叉树中的节点的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。