代码随想录第二十二天

这篇具有很好参考价值的文章主要介绍了代码随想录第二十二天。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Leetcode 235. 二叉搜索树的最近公共祖先

题目链接: 二叉搜索树的最近公共祖先
自己的思路:乍一看和二叉树的最近公共祖先类似,使用那个题的代码确实可以写出来,但是没有利用到二叉搜索树的性质;我们可以找出p和q结点值的较大者和较小者,遍历整个二叉树,如果出现了某个结点值位于两者之间,就是我们要找的结点;递归三部曲:1、终止条件:如果找到了位于两者之间的结点值,直接返回结点即可;2、传入参数:当前结点,p和q结点和最大值和最小值;3、单层逻辑:如果当前结点值大于最大值,向左递归,如果小于则向右递归,否则返回当前节点!!!

正确思路:递归!

代码:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        int max = p.val>q.val?p.val:q.val;
        int min = p.val<q.val?p.val:q.val;
        return lowestCommonAncestor_new(root,p,q,max,min);
    }

    public TreeNode lowestCommonAncestor_new(TreeNode root,TreeNode p,TreeNode q,int max,int min){
        if (root.val>min&&root.val<max) return root;
        else if (root.val>max) return lowestCommonAncestor_new(root.left,p,q,max,min);
        else if (root.val<min) return lowestCommonAncestor_new(root.right,p,q,max,min);
        return root; 
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode 701. 二叉搜索树中的插入操作

题目链接: 二叉搜索树中的插入操作
自己的思路:没想到!!!

正确思路:这道题不要想复杂了,只需要把要插入的元素插入到叶子节点就可以,想通这点就可以了!!!递归三部曲:1、传入参数和返回值:当前节点、插入的节点值;返回插入之后的树的根节点;2、终止条件:当当前节点为空的时候,返回新建的节点,返回到上一个节点的左或者右节点,具体看下面;3、单层逻辑:当当前节点的值大于val的话,说明要插到左子树里面,返回值为root.left,因为是插到root的左子树里,否则插到右子树里,然后返回当前结点!!!!

代码:

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        //插入到叶子节点上
        if (root==null) return new TreeNode(val);
        //当前节点的值大于val,就插到左子树上
        if (root.val>val){
            root.left = insertIntoBST(root.left,val);
        }
        if (root.val<val){
            root.right = insertIntoBST(root.right,val);
        }
        return root;
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

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

题目链接: 删除二叉搜索树中的节点
自己的思路:没想到!!!!

正确思路:本题并不是遍历整个二叉搜索树,而是遍历到符合条件的二叉搜索树结点然后进行返回,所以本题递归终止条件较为繁琐;递归三部曲:1、传入参数和返回值:当前结点和key值;返回参数为删除之后的树的根节点;2、终止条件:当当前节点为空的时候,直接返回空,当当前结点的值等于key的时候,要分情况处理, ( 1 ) (1) (1):当当前节点为叶子节点时,直接返回空; ( 2 ) (2) (2):当当前节点左节点为空时,返回右节点; ( 3 ) (3) (3):当当前节点右节点为空时,返回左节点; ( 4 ) (4) (4):当左节点不为空,右节点也不为空时,要进行树的变换,我们以删除以后右节点上位为例,那么删除以后的左节点会放到右子树的最左边的非空节点下面即可;3、单层逻辑:左右递归,和二叉搜索树的插入类似!!!!

代码:

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        //终止条件
        if (root==null) return root;
        if (root.val==key){
            if (root.left==null&&root.right==null)  return null;
            else if (root.right==null) return root.left;
            else if (root.left==null) return root.right;
            else{
                TreeNode node = root.right;
                while(node.left!=null){
                    node = node.left;
                }
                node.left = root.left;
                return root.right;
            }
        }
        //左右递归
        if (root.val>key) root.left = deleteNode(root.left,key);
        if (root.val<key) root.right = deleteNode(root.right,key);
        return root;
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)文章来源地址https://www.toymoban.com/news/detail-586011.html

到了这里,关于代码随想录第二十二天的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【代码随想录-Leetcode第二题:27.移除元素】

    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的 样例:示例 1: 解释:函数

    2024年02月14日
    浏览(51)
  • [自我记录]随想录刷题第二天 | 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

     代码随想录打卡第二天, 新手自我记录一下刷题历程, 仅为自我打卡使用. 今天刷了三道主题, 第一道双指针和第三道模拟做出来了, 第二道写出了暴力解法但是提交leetcode超时了, 测试用例过了18/20, 看了carl哥答案以后自己重新补写了滑动窗口方法. 977. 有序数组的平方 简单题

    2024年02月05日
    浏览(45)
  • 代码随想录 图论

    目录 797.所有可能得路径  200.岛屿数量 695.岛屿的最大面积 1020.飞地的数量  130.被围绕的区域  417.太平洋大西洋水流问题  827.最大人工岛 127.单词接龙  841.钥匙和房间 463.岛屿的周长  797. 所有可能的路径 中等 给你一个有  n  个节点的  有向无环图(DAG) ,请你找出所有从

    2024年04月10日
    浏览(47)
  • [代码随想录]二叉树

    二叉树可以链式存储,也可以顺序存储。 那么链式存储方式就用指针, 顺序存储的方式就是用数组。 顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起。 链式存储如图: 链式存储是大家很熟悉的一种方式,那么

    2024年02月03日
    浏览(59)
  • 代码随想录刷题

    704. 二分查找 27. 移除元素

    2024年01月25日
    浏览(51)
  • 代码随想录——回溯

    代码随想录——回溯 回溯的本质就是递归遍历,但在完成某一条路之后会撤回到上一层,然后重新选择另一条路继续遍历,是一个比较低效的算法,能进行提升的方式就是剪枝。 组合 链接:https://leetcode.cn/problems/combinations/description/ vectorvector int 作为最终返回的结果,vector

    2024年01月19日
    浏览(117)
  • 代码随想录——贪心算法

    代码随想录——回溯 代码随想录——贪心算法 分发饼干 链接:https://leetcode.cn/problems/assign-cookies/description/ 这道题我自己一开始的想法是从大到小遍历孩子数组,对于每个元素从大到小遍历饼干数组,满足则total+1,并且该元素置0防止被再次使用。这样虽然是可以的,但时间复

    2024年02月22日
    浏览(57)
  • 代码随想录 - 链表

    链表是一种通过指针串联的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。 链表的类型  1、单链表  单链表中的指针域只能指向节点的下一个节点。  2、双链表 双链表:

    2024年02月13日
    浏览(44)
  • 代码随想录(番外)图论4

    417. 太平洋大西洋水流问题 那么我们可以 反过来想,从太平洋边上的节点 逆流而上,将遍历过的节点都标记上。 从大西洋的边上节点 逆流而长,将遍历过的节点也标记上。 然后两方都标记过的节点就是既可以流太平洋也可以流大西洋的节点。 也就是说通过从两边的大洋开

    2024年04月29日
    浏览(60)
  • 代码随想录day02

    ● 力扣题目链接 ● 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 思路 ● 暴力排序,时间复杂度O(n + nlogn) ● 使用双指针,时间复杂度O(n) 代码 ● 力扣题目链接 ● 给定一个含有 n 个正整数的数组和一个正整

    2024年02月13日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包