首页 > 其他分享 >LeetCode 450.删除二叉搜索树的结点

LeetCode 450.删除二叉搜索树的结点

时间:2023-04-12 18:01:18浏览次数:49  
标签:right TreeNode val 450 二叉 null root LeetCode left

1.题目:

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

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

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

示例 1:

输入: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]。

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/delete-node-in-a-bst 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


2.代码:

/**
 * 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 && root.right!=null){//左为空,右不为空
                return root.right;
            }else if(root.right==null && root.left!=null){//左不空,右空
                return root.left;
            }else if(root.left==null && root.right==null){//左空,右空
                return null;
            }
            else {
                TreeNode cur = root.right;//左不空,右不空 定义指针指向结点的右孩子
                while(cur.left!=null ){//让指针遍历到最左边的孩子
                    cur = cur.left;
                }
                cur.left=root.left;//让要删除的的结点的左孩子拼接到指针的左孩子上
                root=root.right;//删除结点,就是让结点的右孩子直接覆盖左孩子
                return root;//最后返回该节点
            }
        }
        if(root.val>key) root.left= deleteNode(root.left,key);//左
        if(root.val<key) root.right =deleteNode(root.right,key);//右
        return root;
        

    }
}


标签:right,TreeNode,val,450,二叉,null,root,LeetCode,left
From: https://blog.51cto.com/u_15806469/6186020

相关文章

  • leetcode 185
    部门工资前三高的所有员工 selectd.nameasDepartment,e.nameasEmployee,e.salaryasSalaryfromEmployeeeleftjoinDepartmentdone.departmentId=d.Idwhere2>=(selectcount(distincte1.salary)fromEmployeee1wheree.salary<e1.salary......
  • LeetCode #448 找到所有数组中消失的数字
    基本思路为了满足题目要求的不使用额外的存储空间(当然返回的数组除外),并且时间复杂度控制在O(n),最多只能常数级别遍历,因此考虑将原数组视作一个"哈希表"。遍历原数组,将【1,n】上的值域映射到【0,n-】的坐标上,某个数x扫描到一次则将这个数x映射的x-1的坐标处的值加上n。......
  • LeetCode #283 移动零(双指针版本,效率高)
    基本思路思路————双指针初始状态左右指针都指向数组首位元素,然后right指针开始迭代数组,当碰到非0元素则与左指针left所在位置的元素交换。交换完毕后,左指针left则向前移动到下一位置,做好准备迎接下一个非0元素的交换。这种算法效率比之前撰写的“伪双指针”......
  • LeetCode #414 第三大的数
    解题思路数组从大到小排序后,从第2个元素开始遍历,如果与上一个元素不相同,则标志位++,标志位一旦从1加到3(两次)则代表存在第三大的数,即可返回。如若不存在第三大的数,则在遍历结束后,函数末尾返回数组的第一个元素(最大的元素)。标程1classSolution{2public:3intthirdMa......
  • LeetCode #485 最大连续 1 的个数
    解题思路基础题,最后加一个特殊情况处理就好,时间复杂度O(n)代码  classSolution{public:intfindMaxConsecutiveOnes(vector<int>&nums){intcount=0;intMaxcount=0;for(inti=0;i<nums.size();i++){if(nums[i]==1){......
  • 二级指针创建二叉树节点与一级指针创建二叉树节点
     1、c++中的struct结构体变量定义可以直接“类型名变量名”,c中只能“struct类型名变量名”,可以通过typedef达到相同的效果;struct_x1{...}x1;是定义了类_x1和_x1的对象实例x1,typedefstruct_x2{...}x2; 定义了类_x2和_x2的类别名x2;typedefstruc......
  • UVa 112 Tree Summing (scanf()去空格&递归&二叉树遍历)
    112-TreeSummingTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=48BackgroundLISPwasoneoftheearliesthigh-levelprogramminglanguagesand,withFORTRAN,isoneoft......
  • 108. 将有序数组转换为二叉搜索树
    给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过1」的二叉树。classSolution{public:TreeNode*sortedArrayToBST(vector<int>&nums){......
  • 669. 修剪二叉搜索树
    给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树不应该改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在唯一的答案。所以结果应当返回修剪好......
  • #yyds干货盘点# LeetCode面试题:矩阵置零
    1.简述:给定一个 mxn的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。 示例1:输入:matrix=[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例2:输入:matrix=[[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]......