二叉树(三)经典算法题目解析,子树判断,平衡、对称、翻转、遍历二叉树

直击高频编程考点:树相关知识及经典算法题总结 树相关知识及编程练习总结:背景知识+树的应用举例(Spring中的应用举例+其他框架中的应用举例+实际开发中的应用举例)+相关编程练习(二叉树遍历:包括前序遍历、中序遍历、后序遍历、层序遍历等+二叉树的最大深度+二叉树的最小深度+对称二叉树+二叉树的最近公共祖先+二叉树的直径+二叉树的路径和+二叉搜索树中的插入操作+二叉搜索树中的删除操作+二叉搜索树中的搜索操作+二叉树的层平均值+二叉树的镜像+二叉树的序列化与反序列化+二叉树的右视图+二叉树的最大宽度+前序遍历和中序遍历构造二叉树+平衡二叉树) 阅读详情

前言❤️❤️

hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
这篇博客就到了数据结构中据说最难的部分——二叉树算法题😊🐵
二叉树结构的基础知识不算难,难的是算法题目,这部分之所以难,是因为基本上这些算法都使用了递归,虽然代码就那么几行,但是想理解透递归的调用过程,还是需要花费一些力气的
博主计划一共解析14道经典的二叉树算法题目,这篇博客解析7道,下篇博客解析7道,为了方便解析,这篇博客的所有题目博主都画了递归解析图,初学的铁汁强烈建议每道题目都自己画一下递归图,细品下过程
这个专栏的数据结构是代码都是用Java来写的,JavaSE专栏现在已经全部更新完成,铁汁们复习基础知识时非常推荐使用,可以试一下💪💪💪
在这里插入图片描述
🎇个人主页:洋不写bug的博客
🎇所属专栏:数据结构专栏
🎇复习Java基础知识:Java学习之旅,从入门到进阶
🎇铁汁们对于数据结构基础的各种核心知识(不太常用的也有😆),都可以在上面的数据结构专栏学习,专栏正在持续更新中🐵🐵,有问题可以写在评论区或者私信我哦~

1,相同的树

在这里插入图片描述
力扣链接

题意就是传入两棵树的根结点,判断这两棵树是否完全相等,这个题目仍然可以使用递归的方法来解决,可以分为以下几步:

  1. 判定两个树的根结点是否相同
  2. 递归判定左子树是否相同
  3. 递归判定右子树是否相同

只要发现上面任何一个环节出现不同,就返回false,如果从头到尾都没有返回false,就返回true


class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q == null){
            return true;
        }
        if((p == null && q != null) || (p != null && q == null)){
            return false;
        }
        if(p.val != q.val){
            return false;
        }
        boolean isLeftSame = isSameTree(p.left,q.left);
        boolean isRightSame = isSameTree(p.right,q.right);
        return isLeftSame && isRightSame;
    }
}

画图分析分析下递归过程

在这里插入图片描述

2,另一棵树的子树

在这里插入图片描述

力扣链接

这个题目让我们判断subRoot是否是root的子树(subRoot和root是两棵树的根结点),在上个题目的基础上,做这道题就简单

  1. 首先判断root和subRoot是不是相同的树(题目中给出了,如果两个树相同,subRoot也可以看作是root的子树)
  2. 递归判定root.left是否包含subRoot
  3. 递归判定root.right是否包含subRoot

只要中间有一处判定成功,就返回true

class Solution {
    public static boolean isSameTree(TreeNode p,TreeNode q){
        if(p == null && q == null){
            return true;
        }
        if(p == null && q != null){
            return false;
        }
        if(p != null && q == null){
            return false;
        }

        if(p.val != q.val){
            return false; 
        }

        boolean isLeftSame = isSameTree(p.left,q.left);
        boolean isRightSame = isSameTree(p.right,q.right);
        return isLeftSame && isRightSame;
    }

    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root == null && subRoot == null){
            return true;
        }
        if(root != null && subRoot == null){
            return false;
        }
        if(root == null && subRoot != null){
            return false;
        }

        if(isSameTree(root,subRoot)){
            return true;
        }
        boolean isSubleft = isSubtree(root.left,subRoot);
        boolean isSubRight = isSubtree(root.right,subRoot);
        return isSubleft || isSubRight;
    }
}

题目中已经明确指出了subRoot不为null了,这里博主的代码针对的是不加限制的情况,铁汁们写的时候可以把isSubtree方法刚开始的if判断少写一些



这个题目如果要画图分析递归,就只画isSubTree方法的递归图即可,把isSameTree就当成一个普通方法即可,如果同时画isSameTree和isSubTree的递归图,那就会超级复杂😅,递归过程分析如下:

在这里插入图片描述

3,翻转二叉树

在这里插入图片描述
力扣链接

这个题目依旧是使用递归,就是对根结点的左子结点和右子结点进行翻转,接着再进行递归,对根结点的左子结点的左子结点和右子结点进行翻转,以及对根结点的右子结点的左子结点和右子结点进行翻转,以此类推,就能把整个链表翻转过来

代码就是遍历二叉树,访问结点时,操作为交换该结点的左子结点和右子结点

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null){
            return null;
        }
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
}



这个题目使用前序遍历和后序遍历都可以(博主比较推荐使用前序遍历的写法,因为比较好理解),但不能使用中序遍历,因为中序遍历是先针对左子树来进行递归,递归完成左子树后,那左子树就变成右子树,再去针对右子树进行递归,相当于递归的还是之前的左子树,也就是左子树递归了两次

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null){
            return null;
        }
        invertTree(root.left);
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        invertTree(root.right);
        return root;
    }
}

我们画图来看下中序遍历是如何递归的,可以看到是递归不到右子树上的,运行到invertTree(root.right),递归的还是原来左子树的结点

在这里插入图片描述

4,平衡二叉树

在这里插入图片描述
力扣链接

平衡二叉树:针对这个树的任何一个结点,左右子树的高度差不超过1,就认为是平衡二叉树,如下图

在这里插入图片描述


在二叉树(二)博客中,解析了计算二叉树的高度的方法,代码如下:

    public int getHeight(TreeNode root){
        if(root == null){
            return 0;
        }
        return 1 + Math.max(getHeight(root.left),getHeight(root.right));
    }



使用getHeight方法,先判断当前结点的左右子树的高度差有没有超过1,再递归的判断左子结点和右子结点的左右子树的高度差有没有超过1,就这样一直递归判断,直到判断到最后一层,递归是有一个结点不符合要求,这棵树就不是平衡二叉树

空结点或者单独一个结点,都算是平衡二叉树,就直接返回true

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null){
            return true;
        }
        if(root.left == null && root.right == null){
            return true;
        }
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        if(leftHeight - rightHeight > 1 || rightHeight - leftHeight > 1){
            return false;
        }
        boolean isLeftBalanced = isBalanced(root.left);
        boolean isRightBalanced = isBalanced(root.right);
        return isLeftBalanced && isRightBalanced;
    }

    public int getHeight(TreeNode root){
        if(root == null){
            return 0;
        }
        return 1 + Math.max(getHeight(root.left),getHeight(root.right));
    }
}



递归分析图如下(如果isBalanced里面传入的结点没有左右子树或者为null,博主就不再继续往下画了,直接返回true)

在这里插入图片描述

5,对称二叉树

在这里插入图片描述
力扣链接

判断对称二叉树就是判断根结点的左子树和右子树是否为镜像,如下图,左子树的根结点为t1,右子树的根结点为t2,判断镜像的方法分为以下几步:

  1. 判断根结点的值是否相同,如果不相同就直接返回false
  2. 递归判断t1.left和t2.right是否互为镜像
  3. 递归判断t1.right和t2.left是否互为镜像

在这里插入图片描述



我们写个isMirror方法,传入参数是两个子树的根结点,递归的来执行这些过程,如果在递归过程中一直都没有返回false,那isMirror方法最后就返回true

class Solution {
    public boolean isSymmetric(TreeNode root) {
       return isMirror(root.left,root.right);
    }

    public boolean isMirror(TreeNode t1,TreeNode t2){
        if(t1 == null && t2 == null){
            return true;
        }
        if((t1 != null && t2 == null) || (t2 != null && t1 == null)){
            return false;
        }
        if(t1.val != t2.val){
            return false;
        }
        boolean isMirror1 = isMirror(t1.left,t2.right);
        boolean isMirror2 = isMirror(t1.right,t2.left);
        return isMirror1 && isMirror2;
    }
}

6,二叉树遍历

在这里插入图片描述

牛客链接

刷题平台上的算法题,分为两种类型,核心代码模式和ACM模式,大部分题目都是核心代码模式

前面的5道题目,就都属于是核心代码模式,不需要自己创建Node类,不需要考虑树是怎么创建起来的,有的也不需要考虑输出,就需要写个方法,题目中传入参数,再返回一个参数即可,比较简单

这个题目就是ACM模式,需要自己写结点类,处理输入,创建树,在main方法中处理输入和输出,要考虑的东西就比核心代码模式要多

在这里插入图片描述



题目中说空格字符代表空树,说先用“#”代表空格,但是看示例,输入的时候还是输入的"#“,描述的就不是很清楚,到底是输入的时候输入的是”#“,还是输入的实际是空格,为了方便我们看,用”#"表示,这个就有点歧义

这个问题很好解决,写代码的时候让输入空格可以,输入"#"也可以🐵



这个题目的重点就是如何通过先序遍历的序列来构建出二叉树(正常最少需要两种遍历的序列才能构建出二叉树,但是这个先序遍历序列中对于空树用空格表示出来了,属于特殊的先序序列)

就拿示例1输入的数据来举例,a一定为根结点,后面输入的是b,铁汁们细品下,有办法判断出b是a的左子结点,还是a的右子结点,如果是普通的前序序列,这个是没法判断的
但是,这个前序序列用空格字符代表空树了,a和b输入之间是没有空格的,因此b一定是a的左子结点(如果是右子结点的话,输入就是a#b)

在这里插入图片描述



到c这里,同理,c不可能是b的右子结点(输入为b#c时是这样),更不可能是a的右子结点(输入为b##c时是这样),c一定是b的左子结点

在这里插入图片描述



再接下来是##d,c的左右子树就是#,b的右子结点就是d

在这里插入图片描述


规律就是当一个结点的左子树都构造完成,再去构造这个结点的右子树,按照这个规律,就能构造出完整的树

在这里插入图片描述



因为是ACM模式,所以写代码时所有东西都要自己写:需要定义个Node类,还要考虑输入和输出,题目中提到会有多组输入数据,每组数据是一行字符串,读取输入时就是用while(scanner.hasNextLine),输出时也有要求,每个字符后面有一个空格,每个输出占一行

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    static class Node{
        public char val;
        Node left = null;
        Node right = null;
        public Node(char val){
            this.val = val;
        }
    }


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String line = in.nextLine();
            Node root = build(line);
            inOrder(root);
            System.out.println();
        }
    }

    public static Node build(String s){

    }

    public static void inOrder(Node root){
        if(root == null){
            return;
        }
        inOrder(root.left);
        System.out.printf(root.val + " ");
        inOrder(root.right);
    }

}



核心就是这个build方法,里面传入字符串s,应该通过charAt(index)来读取字符的,就需要创建index成员变量,记录读取到哪个位置了,在main方法的while循环中,每次读取数据后,都需要把index清0

在bulid方法中,先用root.left = build(s),递归的构建左子树,再用root.right = build(s),递归的构建右子树

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String line = in.nextLine();
            Node root = build(line);
            inOrder(root);
            System.out.println();
        }
    }

    public static int index = 0;
    public static Node build(String s){
        char c = s.charAt(index);
        if(c == '#' || c == ' '){
            return null;
        }
        Node root = new Node(c);
        index++;
        root.left = build(s);

        index++;
        root.right = build(s); 

        return root;
    }



接着画图细品下递归过程

在这里插入图片描述

7,二叉树的层序遍历

在这里插入图片描述
力扣链接

层序遍历在二叉树(一)博客中就已经解析过,就是让元素入队列,出队列时进行打印,再把出队列的结点的left和right也加入到队列中,代码如下

    public static void levelOrder(Node root){
        if(root == null){
            return;
        }
        Queue<Node> queue = new ArrayDeque<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            Node cur = queue.poll();
            System.out.printf(cur.val + " ");
            if(cur.left != null){
                queue.offer(cur.left);
            }
            if(cur.right != null){
                queue.offer(cur.right);
            }
        }
    }

但这个题目不是简单的层序遍历,输出时同一层中,同一层的结点输出时要放到同一个[]中

因为方法的返回类型是一个二维的List,不是打印按照层序来打印,如果还是用普通层序遍历,在元素出队列时,是很难判断这个元素到底加到哪个一维List中的



可以使用先序遍历,创建一个level变量,表示把元素加到哪个一维List中去,每次递归时level + 1

写个levelOrderHelper方法,里面传入三个参数:root、level、result,进行前序遍历,先把root.val添加到ressult中对应的一维List中,如果这个一维List还没有创建,就需要先创建下

接着再递归的处理root.left和root.right,递归调用levelOrderHelper方法时,需要level + 1(level的起始值为0,result.get(0)相当于是树的第一层的元素)

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if(result == null){
            return result;
        }
        levelOrderHelper(root,0,result);
        return result;
    }

    public static void levelOrderHelper(TreeNode root,int level,List<List<Integer>> result){
        if(root == null){
            return;
        }
        if(result.size() == level){
            result.add(new ArrayList<>());
        }

        List<Integer> curRow = result.get(level);
        curRow.add(root.val);
        levelOrderHelper(root.left,level + 1,result);
        levelOrderHelper(root.right,level + 1,result);
    }
}



用示例1中的树,画图来模拟下递归过程

在这里插入图片描述

结语

  • 这7道题目解决起来并不简单,有的直接可以在原方法中递归解决,有的需要写个Helper方法方法,在Helper方法中进行递归,学习这部分内容的最好方法就是画图细品,自己多写几次代码,然后过段时间再来写这个题目的代码,看有没有完整的思路,多细品,代码能力一定会提升的💪💪💪



以上就是今天的所有内容啦~完结撒花~🥳🎉🎉

在这里插入图片描述

新手必看:5分钟搞定Unitree Go1机器狗Gazebo仿真运动控制(附按键图解) 本文为新手提供了Unitree Go1机器狗在Gazebo仿真环境中实现运动控制的快速指南。通过5分钟极简配置和按键图解,帮助开发者快速掌握宇树科技明星产品的基础操作,包括环境搭建、仿真启动和运动控制技巧,适合零基础用户快速上手。 阅读详情

相关推荐

智能客服系统知识库数据清洗

数据清洗(Data Cleaning)是确保智能客服知识库高效运行的重要环节,主要涉及。| 分类 & 标签优化 | 重新组织 FAQ,创建关键字索引 || 定期更新 | 结合用户反馈,每 1-3 个月优化 |才能提供更优质、正确的回答,提升客户满意度!、Zendesk、Intercom 等)中,: FAQ 或客服回答中可能存在。,会影响 AI 匹配的准确性。是一个持续优化的过程,

z1941563559的博客 2098

【LeetCode】二叉树oj专题

二叉树你真的二了解吗?来巩固一下!

小八哥 2518

用workbuddy自定义Skill:手把手搭建AI炒股分析助手

AI Agent正成为个人投资研究的重要工具,而Skill作为行为规范,能让AI输出保持稳定与专业。在AI Agent应用中,很多人分不清Skill与Agent的区别:Agent负责目标拆解与执行,Skill则固化分析流程与输出模板。借助本地工作台workbuddy,用户可自定义Skill,实现从市场环境检查到财务排雷的五段式分析。通过调低温度参数、设定数据验证规则,该方案能有效避免大模型凭空编造数据,帮助个人投资者快速完成基本面体检、资金面观察与风险清单生成。本文基于一套可直接套用的配置与一个月实测,展示

weixin_29038537的博客 520

牛客网刷题——二叉树

二叉树刷题

chenchenchencl的博客 6989

物料帐配置之 重估消耗

物料帐配置 ML material ledger

SAP刺客的博客 5910

手把手讲解RTX5操作系统在GD32F407上的移植

然后将GD32F4xx_Demo_Suites_V2.6.4\GD32407V_START_Demo_Suites\Projects\01_GPIO_Running_LED下面的main函数复制到我们的项目文件夹中;打开对应GD32407V_START_Demo_Suites的文件夹下面的Utilities,复制gd32f407v_start.c和gd32f407v_start.h文件到一开始项目保存的文件夹下面;为了验证我们的操作系统是否被正确添加,是否能够正确运行,我们需要添加示例文件;

Praguejing的博客 1860

【典例】二叉树递归结构经典题目合集@二叉树

二叉树经典题目解析 本文总结了5道经典的二叉树递归遍历题目: 单值二叉树 - 判断所有节点值是否相同,通过比较根与左右子树的值 相同二叉树 - 比较两棵树的结构和节点值是否完全一致 镜像二叉树 - 判断是否为对称二叉树,实际上是相同二叉树的变形 另一棵树的子树 - 通过递归比较root的每个子树与subTree是否相同 翻转二叉树 - 递归交换左右子树的位置 这些题目都体现了递归的核心思想:处理当前节点,递归处理左子树和右子树。解题关键在于: 明确递归终止条件 拆分问题为当前节点处理和子问题递归 合理利用辅

浮光掠影 1579

【对比学习+分割】CRIS:CLIP驱动RIS图像分割(CVPR 2022)

CRIS: CLIP-Driven Referring Image Segmentation

这个博客太懒了什么都没说 3325

《从零搭建二叉树体系:从节点定义到子树判断的实战指南(含源码可直接运行)》

本文系统介绍了二叉树的基础概念、构建方法和常用操作。主要内容包括:1)二叉树的基本术语和特殊类型(满二叉树、完全二叉树等);2)环境准备与代码目录结构;3)二叉树的两种构建方式(手动创建和先序遍历字符串构建);4)深度优先遍历的三种实现(先序、中序、后序);5)计算节点数、树高度等基本属性;6)经典算法题解析,如翻转二叉树。文章特别强调了递归实现的易错点和注意事项,为二叉树学习提供了清晰的实践指导。

2403_87581574的博客 1089

LOFIC / 全局快门在移动端的可行性:曝光容限、读出噪声与算力预算

手机端引入 LOFIC 与全局快门的核心权衡在于:在有限像素面积与功耗下,如何换取更高的动态范围与运动场景鲁棒性。LOFIC 通过侧向溢流到积分电容扩大满井并保持较高转换增益,全局快门在帧内一次性采样消除行时序伪影,但需付出像素填充率、读出噪声与片上存储功耗的代价。本文以工程可实操为目标,给出像素与读出链的简化模型、曝光损益测算、数据率与带宽估算、端到端算力与热预算方法,配套寄存器配置流程、帧内/帧间切换策略与验证清单,帮助在真实移动 SoC 与 ISP 约束下完成可行性评估与原型落地。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1139

手把手教你学Simulink--使用Simulink进行双冗余电机驱动系统的故障切换验证

提高系统可靠性:当一个电机或其驱动器出现故障时,另一个可以立即接管,避免系统停机。增强安全性:对于一些关键任务的应用场景(如飞行控制),确保即使在硬件故障情况下也能维持基本操作能力。简化维护:允许在不影响系统正常工作的情况下进行维护和更换故障部件。确定可能发生的故障类型(如过流、欠压、温度过高),以及每种故障对应的条件。通过上述步骤,我们简要介绍了如何基于Simulink实现双冗余电机驱动系统的故障切换验证。

MHD0815的博客 438

6.二叉树.题目1

个人根据代码随想录刷题的思路和笔记整理

weixin_43831098的博客 919

开源GIS -- 笔记

基础开发库 数据读写:GDAL/OGR(C/C++) ArcGIS和GE都是使用此工具 投影转换:Proj.4(C/C++) 拓扑计算:JTS(Java),GEOS(C++),Shapely(python) 组件式开发库 GeoTools(Java),DotSpatial(.NET) 空间分析: Scipy(通用科学计算、方程求解), numpy,NextworkX, rPy(统计分析), Scikit-learn,pysal(空间分析) 深度学习: Keras、 tensorflow、 pytor

DZ Space 4521

二叉树的相关列题!!

不得不做的二叉树的相关列题!!

weixin_64308540的博客 922

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++ 小白入门leetcode (三)——tree 树 简单题目 详细解析

Tree C++ 100. 相同的树 给定两个二叉树,编写一个函数来检验它们是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 一: class Solution { public: static string s; bool isSameTree(TreeNode* p, TreeNode* q) { if(p==NULL&a...

www_z_dd的博客 1012

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

二叉树OJ题:牛客KY11二叉、Leetcode110平衡二叉树、100. 相同的树、leetcode965单值二叉树、 leetcode226. 翻转二叉树、leetcode572. 另一棵树的子树

二叉树递归题

myscratch的博客 303

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

二叉树习题-小记

二叉树

xy199931的博客 481

二叉树高频题精讲 | 从入门到熟练掌握二叉树操作2

小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记,会试着做一下批注和补充,如转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!本节,我将分享一下二叉树的习题部分,以及思路详解,在力扣 的运行环境,每一题将会附上练题链接,大家点击即可练习!

HRDMN的博客 433

二叉树经典例题

最小堆 [0,3,2,5,7,4,6,8],在删除堆顶元素 0 之后,其结果是() A. [3, 2, 5, 7, 4, 6, 8] B. [2, 3, 5, 7, 4, 6, 8] C. [2, 3, 4, 5, 7, 8, 6] D. [2, 3, 4, 5, 6, 7, 8]:已知小根堆为 8,15,10,21,34,16,12,删除关键字 8 之后需重建堆,在此过程中,关键字之间的比较次数是()。节点 100> 子节点 65,也不满足小顶堆,不是堆。

ChaoZiLL的博客 164

代码随想录学习摘抄day7(二叉树11-21)

参数:需要二叉树的根节点,还需要一个计数器,这个计数器用来计算二叉树的一条边之和是否正好是目标和,计数器为int型。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0。

2301_80437645的博客 767

经典算法题目及思路解法总结

一 绪论 1 最大连续子数组:给定一个数组,求它的连续子数组,使得该子数组的和最大 解法: (1)暴力法 (2)分治法 (3)分析法 (3)动态规划法 2 查找旋转数组的最小值 3 零子数组 4 LCS(最长公共子序列):两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列 LCS可以描述两段文字之间的“相似度” 解法: (1)穷举法 (2)动态规划法 5 LCS的应用:最长...

Selenitic_G的博客 8700

代码随想录算法训练营第十三天:平衡二叉树,二叉树的所有路径,左叶子之和,完全二叉树的节点个数

然后是确定递归的终止条件,一般我们的终止条件都是当前节点为空就终止,但是这题不一样,本题我们要找的是叶子节点,到叶子节点终止递归,也就是我们要找到左右孩子都为null的节点才终止递归。今天四道题又是对递归的深化理解,说实话递归真不好想,基本上每道题都得写个例子一步一步往下推才能直观的想明白递归的逻辑,你们在写递归除了我们每道题都用上的递归三部曲,画图也是一个帮助你们理解的重要技能,对着代码看半天不如五分画个图一步一步推下来,思路立马就清晰了,二叉树真是望不到头啊,明天依旧是二叉树,我会快快的更新博客的。

guoba250的博客 911

二叉树系列汇总,持续更新!

这次终于把二叉树弄懂了!

不积跬步,无以至千里! 2915

leetcode 二叉树专题——java实现

二叉树相关算法的java形式

weixin_44040169的博客 1181

Leetcode Hot 100 —— 二叉树 part01

Leetcode Hot 100 —— 二叉树 part01

qq_52421969的博客 822

20道真题训练|学会二叉树的前世今生(三)

Java基础学习主要以练习为主,很多朋友听完视频课程学会基础以后感觉对练手项目无从下手,这里推荐去牛客网看看,这里的IT题库内容很丰富,属于国内做的很好的IT学习网站,而且是课程+刷题+面经+求职+讨论区分享。从基础开始练习,知识点编排详细,题目安排合理,题目表述以指导的形式进行。整个题单覆盖了java入门的全部知识点以及全部语法,通过知识点分类逐层递进,从基础开始到最后的实践任务,都会非常详细地指导你应该使用什么函数,应该怎么输入输出。

zhangxia_的博客 1282
上一篇: 二叉树(二) 常见基础操作解析|结点数、树高、查找结点、判断完全二叉树
下一篇: 滑动窗口算法详细解析(8道经典题目)
洋不写bug
博客等级 码龄2年 87粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值