450. 删除二叉搜索树中的节点-----递归

题目表述

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;
如果找到了,删除它。

示例:

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。

递归

根据二叉搜索树的性质

  • 如果目标节点大于当前节点值,则去右子树中删除;

  • 如果目标节点小于当前节点值,则去左子树中删除;

  • 如果目标节点就是当前节点,分为以下三种情况:

    • 其无左子:其右子顶替其位置,删除了该节点;
    • 其无右子:其左子顶替其位置,删除了该节点;
    • 其左右子节点都有:其左子树转移到其右子树的最左节点的左子树上,然后右子树顶替其位置,由此删除了该节点。
class Solution { public TreeNode deleteNode(TreeNode root, int key) { return delete(root,key); } public TreeNode delete(TreeNode root, int key){ if(root == null){ return null; } if(root.val < key){ root.right = delete(root.right, key); }else if(root.val > key){ root.left = delete(root.left, key); }else{ if(root.right == null) return root.left; else if(root.left == null) return root.right; else if(root.left != null && root.right != null){ TreeNode right = root.right; while(right.left != null){ right = right.left; } right.left = root.left; root = root.right; } } return root; } }

__EOF__

本文作者Younger
本文链接https://www.cnblogs.com/youngerwb/p/16343935.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   YoungerWb  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示