首页 > 其他分享 >leetcode刷题day14|二叉树Part02(以递归方法为主:226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度)

leetcode刷题day14|二叉树Part02(以递归方法为主:226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度)

时间:2024-09-11 22:23:40浏览次数:3  
标签:right return int null 二叉树 深度 101 root left

226.翻转二叉树

思路:利用先序遍历递归翻转
1、终止条件:节点为空,return
2、参数:root
3、递归函数逻辑:处理中间节点,交换;递归左孩子,递归右孩子
代码如下:

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

101. 对称二叉树

思路:考察根节点下的两棵树是否对称。思考了一下该题只能使用后序遍历,一棵树的遍历顺序是左右中,另一颗是右左中。
1、传入参数:左孩子,右孩子;返回值bool类型
2、终止条件:左孩子为空,右孩子不为空return false;
左孩子不为空,右孩子为空return false;
左孩子为空,右孩子为空,return true;
左孩子不为空,右孩子不为空,左孩子.val不等于右孩子.val,return false;
剩下一种情况进一步递归判断。
3、递归逻辑:递归调用(左孩子的左孩子,右孩子的右孩子)&&递归调用(左孩子的右孩子,右孩子的左孩子)。
代码如下:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null) return true;
        return compare(root.left,root.right);
    }
    public boolean compare(TreeNode left,TreeNode right){
        if(left==null && right!=null) return false;
        else if(left!=null && right==null) return false;
        else if(left==null && right==null) return true;
        else if(left!=null && right!=null && left.val!=right.val) return false;
        else return compare(left.left,right.right) && compare(left.right,right.left);
    }
}

104.二叉树的最大深度

后序遍历递归

思路:1、传入参数:root,返回值类型:int;2、终止条件:如果节点为空,返回0;3、递归逻辑:判断左孩子的深度(递归)和右孩子深度谁更大,最大深度为大的+1。
代码:

class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null) return 0;
        int leftDepth=maxDepth(root.left);//左
        int rightDepth=maxDepth(root.right);//右
        return Math.max(leftDepth,rightDepth)+1;//中
    }
}

先序遍历递归

设置全局变量记录深度1、传入参数:root、deep,无返回值;2、终止条件:如果节点为空,返回;3、递归逻辑:在节点不为空的情况下,deep层数+1;判断深度和全局变量的大小,取大值;计算左孩子的深度(递归);计算右孩子的深度。
代码:

class Solution {
    int maxNum=0;
    public int maxDepth(TreeNode root) {
        preMax(root,0);
        return maxNum;
    }
    public void preMax(TreeNode root,int deep){
        if(root==null) return;
        deep++;//节点存在,层数+1
        maxNum=maxNum>deep? maxNum: deep;//中
        preMax(root.left,deep);
        preMax(root.right,deep);
    }
}

层次遍历递归

思路:通过每一层队列的元素数量来遍历每一层,使用全局变量deep对层数计数。

class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null) return 0;
        Queue<TreeNode> queue=new LinkedList<>();
        int deep=0;
        queue.offer(root);
        while(!queue.isEmpty()){
            int size=queue.size();
            deep++;
            for(int i=0;i<size;i++){
                TreeNode node=queue.poll();
                if(node.left!=null) queue.offer(node.left);
                if(node.right!=null) queue.offer(node.right);
            }
        }
        return deep;
    }
}

111.二叉树的最小深度

注意:求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子一个为空一个不为空的逻辑。当节点的左右孩子一个为空一个不为空时不能说这个节点为叶子节点。
思路:思路:1、传入参数:root,返回值类型:int;2、终止条件:如果节点为空,返回0;3、递归逻辑:判断左孩子的深度(递归),右孩子深度。如果节点的左子树为空,右子树不为空,返回右子树深度+1;如果左子树不为空,右子树为空,返回左子树深度+1;如果均不为空,返回左右子树深度更小的+1。
代码如下:

class Solution {
    public int minDepth(TreeNode root) {
        if(root==null) return 0;
        int leftDepth=minDepth(root.left);
        int rightDepth=minDepth(root.right);
        if(root.left==null && root.right!=null) return rightDepth+1;
        else if(root.left!=null && root.right==null) return leftDepth+1;
        else return Math.min(leftDepth,rightDepth)+1;
    }
}

层序遍历是从上往下遍历的,只要在遍历时加一个是否为叶子节点的判断即可,如果为叶子节点,直接返回deep值。先序遍历也要加一个是否为叶子节点的判断,只有在叶子节点处才更新全局变量MinDepth.

标签:right,return,int,null,二叉树,深度,101,root,left
From: https://blog.csdn.net/m0_51007517/article/details/142150101

相关文章

  • Day13 二叉树part03| LeetCode 110.平衡二叉树,二叉树的所有路径,左叶子之和,完全二叉树
    110.平衡二叉树110.平衡二叉树定义:左右子树的高度差的绝对值不超过1深度:从上到下查——>前序遍历(中左右)高度:从下到上查——>后序遍历(左右中)classSolution{publicbooleanisBalanced(TreeNoderoot){if(getHeight(root)==-1)......
  • NC 序列化二叉树
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。描述请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字......
  • 【小白深度教程 1.16】手把手教你使用 Pytorch3D(1)使用 3D 损失函数来拟合 Mesh
    【小白深度教程1.16】手把手教你使用Pytorch3D(1)使用3D损失函数来拟合Mesh1.安装和导入模块2.加载.obj文件并创建Mesh对象3.可视化源Mesh和目标Mesh4.迭代优化进行拟合5.可视化损失6.保存结果在这篇文章中,我们将学习如何使用3D损失函数变形源......
  • TensorFlow深度学习框架改进K-means、SOM自组织映射聚类算法及上海招生政策影响分析研
    全文链接:https://tecdat.cn/?p=37652 原文出处:拓端数据部落公众号 分析师:ChenZhang 在教育政策研究领域,准确评估政策对不同区域和学生群体的影响至关重要。2021年上海市出台的《上海市初中学业水平考试实施办法》对招生政策进行了调整,其中名额分配综合评价模块的变化尤为......
  • 二叉树(上)
    目录树型结构概念二叉树概念二叉树的存储 二叉树基本操作基本变量二叉树的遍历完整代码树型结构概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 树......
  • 基于深度学习的骨龄检测识别系统(PyTorch+Pyside6+YOLOv5模型)
    骨龄是骨骼年龄的简称,需要借助于骨骼在X光摄像中的特定图像来确定。通常要拍摄左手手腕部位的X光片,医生通过X光片观察来确定骨龄。在2006年,《中华-05》骨龄标准被编入《中华人民共和国行业标准》,成为中国目前唯一的行业骨龄标准。而在《中华-05》中作者一般推荐使用RUS-CHN计......
  • VD1013 DFN小封装芯片 适用于小电流的输出的电池保护芯片
            VD1013内置高精度电压检测电路和延迟电路以及内置MOSFET,是用于单节锂离子/锂聚合物可再充电电池的保护IC。        本IC适合于对1节锂离子/锂聚合物可再充电电池的过充电、过放电和过电流进行保护   。VD1013具备如下特点:高精度电压检测电路......
  • SLAM 中的 逆深度 是什么?
    在SLAM(同步定位与地图构建)中,逆深度是指深度的倒数。深度表示从相机到物体的距离,而逆深度则是这个距离的倒数,即:\[\text{逆深度}=\frac{1}{\text{深度}}\]逆深度的概念深度:在计算机视觉中,深度通常是指从摄像头或传感器到某个物体表面的距离,即点的三维坐标中的(Z)轴距离。......
  • 算法与数据结构——图的基础操作及图的遍历(广度优先与深度优先)
    图的实现基于邻接矩阵的实现给定一个顶点数量为n的无向图:初始化:传入n个顶点,初始化长度为n的顶点列表vertices,使用O(n)时间;初始化n*n大小的邻接矩阵adjMat,使用O(n2)时间。添加或删除边:直接在邻接矩阵中修改指定的边即可,使用O(1)时间。而由于是无向图,因此需要同时更新两个......
  • 深度学习框架
    1.简介深度学习框架是加速和简化深度学习开发过程的工具。它们提供了一整套的库和接口,方便开发者处理复杂的数学运算和数据处理,从而更专注于模型的设计和优化。常见的深度学习框架有TensorFlow和PyTorch。2.为什么需要深度学习框架手动实现深度学习模型涉及复杂的数学计......