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

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

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

首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
图片说明
解题思路
先找到节点,然后根据该节点的位置来进行删除
如果为叶节点则直接删除
如果只有一个孩子节点,则孩子节点代替它
否则,需要用右子树的最左节点来替代它(或者左子树的最右节点),这里简单用改变节点值来实现,实际情况可以更改指针
运行结果
图片说明
java代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null) return null;
        if(root.val == key){
            //对应无孩子节点或只有一个孩子节点
            if(root.left == null) return root.right;
            if(root.right == null) return root.left;
            //寻找右子树的最左节点来进行替代
            int minval=getMin(root.right);
            root.val=minval;
            root.right=deleteNode(root.right,minval);
        }else if(root.val > key){
            root.left=deleteNode(root.left,key);
        }else if(root.val < key){
            root.right=deleteNode(root.right,key);
        }
        return root;
    }

    public int getMin(TreeNode node){
        while(node.left != null){
            node=node.left;
        }
        return node.val;
    }
}
Leetcode-牛客-刷题笔记 文章被收录于专栏

本专栏主要用于分享栏主在准备java后端面试过程中的刷题笔记

全部评论

相关推荐

10-28 10:48
已编辑
门头沟学院 Java
孩子我想要offer:发笔试后还没笔试把我挂了,然后邮箱一直让我测评没测,后面不知道干嘛又给我捞起来下轮笔试,做完测评笔试又挂了😅
点赞 评论 收藏
分享
程序员花海_:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务