【深度优先】【广度优先】Leetcode 104 二叉树的最大深度 Leetcode 111 二叉树的最小深度 Leetcode 110 平衡二叉树

news2024/10/7 18:27:20

【深度优先】【广度优先】Leetcode 104 二叉树的最大深度 Leetcode 111 二叉树的最小深度 Leetcode 110 平衡二叉树

  • Leetcode 104 二叉树的最大深度
    • 解法1 深度优先 递归法 后序:左右中
    • 解法2 广度优先:层序遍历
  • Leetcode 111 二叉树的最小深度
    • 解法1 深度优先:递归 后序遍历 左右中
    • 解法2 广度优先:层序遍历
  • Leetcode 110 平衡二叉树
    • 解法1 深度优先,求高度则用后序遍历:不断将左右子树的高度返回给根节点

二叉树节点的深度:
指从根节点到该节点的最长简单路径边的条数或者节点数
(取决于深度从0开始还是从1开始)
二叉树节点的高度:
指从该节点到叶子节点的最长简单路径边的条数后者节点数
(取决于高度从0开始还是从1开始)

【前序求的是深度,后序求的是高度】

---------------🎈🎈题目链接🎈🎈-------------------

Leetcode 104 二叉树的最大深度

解法1 深度优先 递归法 后序:左右中

即先求左子树高度,再求右子树高度,再取最大返回给根节点
返回最大深度也就是求根节点的高度

时间复杂度O(N)
空间复杂度O(N)

/**
 * 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 int maxDepth(TreeNode root) {
        // 返回最大深度也就是求根节点的高度
        // 采用深度优先 递归法 后序:左右中 即先求左子树高度,再求右子树高度,再取最大返回给根节点
        if(root == null) return 0;
        // 左
        int leftdepth = maxDepth(root.left);
        // 右
        int rightdepth = maxDepth(root.right);
        // 中
        return 1 + Math.max(leftdepth,rightdepth);
    }
}      
    

解法2 广度优先:层序遍历

时间复杂度O(N)
空间复杂度O(N)


/**
 * 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 int maxDepth(TreeNode root) {
        // 层序遍历
        Queue<TreeNode> myqueue = new LinkedList<>();
        if(root == null) return 0;
        myqueue.add(root);
        int result = 0;
        while(!myqueue.isEmpty()){
            int size = myqueue.size();
            for(int i = 0; i < size; i++){
                TreeNode temp = myqueue.poll();
                if(temp.left != null){
                    myqueue.add(temp.left);
                }
                if(temp.right != null){
                    myqueue.add(temp.right);
                }
            }
            result +=1;
        }
        return result;

    }
}

Leetcode 111 二叉树的最小深度

---------------🎈🎈题目链接🎈🎈-------------------

解法1 深度优先:递归 后序遍历 左右中

这里要特别注意⭐️
最小深度—— 根节点到叶子节点的长度【左右孩子都为null的才是叶子结点】
/1.如果左子树为空,右子树不为空,最小深度是 1 + 右子树的深度。
/2.如果右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。
/3.如果左右子树都不为空,返回左右子树深度最小值 + 1 。

时间复杂度O(N)
空间复杂度O(N)

/**
 * 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 int minDepth(TreeNode root) {
        // 深度优先遍历 递归 后序遍历 左右中
        // 最小深度—— 根节点到叶子节点的长度【左右孩子都为null的才是叶子结点】
        // 1.如果左子树为空,右子树不为空,最小深度是 1 + 右子树的深度。
        // 2.如果右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。
        // 3.如果左右子树都不为空,返回左右子树深度最小值 + 1 。

        if(root == null) return 0; //递归终止条件,遇到null返回0,表示当前的节点的高度为0
        int leftdepth = minDepth(root.left); // 左
        int rightdepth = minDepth(root.right); // 右
        if(root.left == null){return 1+rightdepth;}
        else if(root.right == null){return 1+leftdepth;}
        else{
            return 1+Math.min(leftdepth,rightdepth);
        }
        
    }
    
}

解法2 广度优先:层序遍历

时间复杂度O(N)
空间复杂度O(N)

/**
 * 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 int minDepth(TreeNode root) {
        // 层序遍历
        Queue<TreeNode> myqueue = new LinkedList<>();
        if(root == null) return 0;
        myqueue.add(root);
        int result = 0;
        while(!myqueue.isEmpty()){
            int size = myqueue.size();
            for(int i = 0; i < size; i++){
                TreeNode temp = myqueue.poll();
                if(temp.left != null){
                    myqueue.add(temp.left);
                }
                if(temp.right != null){
                    myqueue.add(temp.right);
                }
                if(temp.left == null && temp.right==null){
                    return result+1;
                }
            }
            result +=1;
        }
        return result;

    }
}
       


Leetcode 110 平衡二叉树

在这里插入图片描述

解法1 深度优先,求高度则用后序遍历:不断将左右子树的高度返回给根节点

1 明确递归函数的参数和返回值
参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度。
2 明确终止条件
递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0
3 明确单层递归的逻辑
如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。
分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

时间复杂度O(N)
空间复杂度O(N)

/**
 * 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 boolean isBalanced(TreeNode root) {
        int height = getHeight(root);
        if(height != -1) return true;
        else return false;

    }
    public int getHeight(TreeNode root){ // 参数和返回值
        if(root == null) return 0;  // 明确终止条件 递归的过程中遇到空节点终止,返回0,表示当前节点为根节点的树高度为0
        int leftheight = getHeight(root.left); // left
        if(leftheight == -1){
            return -1;
        }
        int rightheight = getHeight(root.right); // right
        if(rightheight == -1){
            return -1;
        }
        if(Math.abs(leftheight-rightheight) >1) return -1;  // root
        else{return Math.max(leftheight,rightheight)+1;}



    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1456186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Codeforces Round 924 (Div. 2)题解(A-D)

A - Rectangle Cutting 链接&#xff1a;A - Rectangle Cutting 思路 考虑横边和纵边&#xff0c;若为偶数&#xff0c;则从中间分开&#xff0c;重新组合为一个长方形&#xff0c;检测是否与原来的长方形一致。 代码 #include <bits/stdc.h> using namespace std;i…

湖南建研工程质量检测系统/Scripts/admintool文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

2.C语言——输入输出

1.字符输入输出函数 1.输入:getchar() 字面意思&#xff0c;接收单个字符&#xff0c;使用方法 char a; a getchar();实际上效果等同于char a; scanf("%c",&a);2.输出:putchar() 2.格式化输入输出函数 1.输入:scanf() 格式&#xff1a; scanf(“格式控制…

lvs DR模式+基于五台服务器部署keepalived + lvs DR模式架构(前端带路由)负载均衡的高可用集群

lvs DR模式基于五台服务器部署keepalived lvs DR模式架构(前端带路由)负载均衡的高可用集群 DR模式一&#xff1a; 客户端&#xff1a;172.20.26.167 LVS服务器&#xff1a;172.20.26.198 后端服务器&#xff1a;172.20.26.218 后端服务器&#xff1a;172.20.26.210 两台…

day05-股票数据采集功能

股票数据采集 今日目标 1.掌握RestTemplate基本使用; 2.阅读并理解第三方股票接口API; 3.基于RestTemplate实现国内大盘数据采集功能; 3.1 项目集成RestTemplate; 3.2 理解基于正则解析响应数据原理; 3.3 掌握常用lambda stream流操作; 4.基于RestTemplate实现国内板块和股票…

浅析SPDK技术:vhost

文章目录 SPDK vhost工作机制SPDK vhost实现SPDK vhost设备管理结构vhost_dev_register&#xff1a;注册vhost设备new_connection&#xff1a;新建连接会话start_device&#xff1a;启动设备会话 SPDK vhost-blk实现rpc_vhost_create_blk_controller&#xff1a;创建vhost-blk设…

Feign 第一次调用为什么会很慢?

前言 首先要了解 Feign 是如何进行远程调用的&#xff0c;这里面包括&#xff0c;注册中心、负载均衡、FeignClient 之间的关系&#xff0c;微服务通过不论是 eureka、nacos 也好注册到服务端&#xff0c;Feign 是靠 Ribbon 做负载的&#xff0c;而 Ribbon 需要拿到注册中心的…

融智学应用场景实训实操文化基因系统工程实践指南讲座音频

俗话说&#xff0c;听君一席话胜读十年书。戴上耳机闭目倾听&#xff08;语言哲学和语言科学基础之上的融智学&#xff09;&#xff1a; “融智学应用场景实训实操文化基因系统工程实践指南讲座音频”&#xff08;一共七章&#xff09;随之便会发现&#xff0c;原来汉字汉语暨…

卫星热平衡试验与太阳光模拟器

卫星热模型是一种用于研究卫星的热特性的模型。卫星在太空中接收到的太阳辐射会导致其表面温度的变化&#xff0c;而表面温度的变化会影响卫星的热传导和热辐射&#xff0c;进而影响其冷却和热平衡。 卫星热模型一般涉及以下几个方面的内容&#xff1a; 1. 热辐射模型&#xf…

Midjourney风格一致功能解读及使用方法

Midjourneys再次迎来更新&#xff0c;本次新增“风格一致”功能&#xff01;用户期待已久的风格模仿功能终于实现了&#xff01; --sref 虽然目前只是测试功能&#xff0c;但已经相当强大了&#xff0c;这篇文章我将带大家先睹为快&#xff01; 别忘了&#xff0c;这个功能目前…

C语言第二十七弹---内存函数

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 内存函数 1、memcpy 使用和模拟实现 2、memmove 使用和模拟实现 3、memset 函数的使用 4、memcmp 函数的使用 总结 前面两弹讲解了字符函数和字符串函数&…

【千帆平台】使用千帆大模型平台创建自定义模型调用API,贺岁灵感模型,文本对话

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和…

【技能树学习】Markdown入门——练习题解析

文章目录 前言1 MarkDown介绍2 段落及强调3 标题4 链接5 图片6 列表7 分割线及引用8 代码块9 表格 前言 本篇文章给出了CSDN Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry…

深圳市金航标电子有限公司,获得多项发明专利,国家高新技术企业

深圳市金航标电子有限公司&#xff0c;获得多项发明专利,国家高新技术企业&#xff0c;“中国卫星导航定位协会”、“广东连接器协会”会员。技术团队来自清华大学和电子科技大学&#xff0c;已取得ISO9001认证和欧盟标准RoHS、REACH认证。“金航标&#xff0c;连接世界”&…

VSCode无法连接远程服务器的两种解决方法

文章目录 VSCode Terminal 报错解决方式1解决方式2you are connected to an OS version that is unsupported by Visual Studio Code解决方法 VSCode Terminal 报错 直接在terminal或cmd中使用ssh命令可以连接服务器&#xff0c;但是在vscode中存在报错&#xff0c;最后一行为…

KNN算法总结

概述 邻近算法&#xff0c;或者说K最邻近&#xff08;KNN&#xff0c;K-NearestNeighbor&#xff09;分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻&#xff0c;就是K个最近的邻居的意思&#xff0c;说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法…

备战蓝桥杯---动态规划(入门3之子串问题)

本专题再介绍几种经典的字串问题。 这是一个两个不重叠字串和的问题&#xff0c;我们只要去枚举分界点c即可&#xff0c;我们不妨让c作为右区间的左边界&#xff0c;然后求[1,c)上的单个字串和并用max数组维护。对于右边&#xff0c;我们只要反向求单个字串和然后选左边界为c的…

真怕了,冻雨天气没有雪地胎怎么活

文 | AUTO芯球 作者 | 王秦 南方过年太苦了 刚暖和2天 又开启冻雨模式 过年前的冰冻阴影还没过去啊 这车都不敢开出去了啊 冰冻天气&#xff0c;雪天行车是一件很考验技术和运气的事情啊&#xff0c; 因为什么&#xff1f; 滑&#xff0c;对吧。 那么有哪些装备可以让…

如何找回丢失照片? 7 种免费照片恢复方法分享

照片可以勾起回忆&#xff0c;让我们想起与最亲近的人一起度过的时光&#xff0c;这就是为什么仅仅丢失一张重要照片就会让人感觉完全毁灭性的——几乎就像你失去了记忆本身一样。好消息是&#xff0c;大多数丢失或意外删除的照片都可以使用照片恢复软件恢复&#xff0c;而且我…

做外贸的你是如何看待2024?

说到2024年的市场行情&#xff0c;有人说会比2023年要好很多。也有人说可能还不如去年&#xff0c;竞争可能会更加的激烈。 而且从各个博主的观点看来&#xff0c;俄罗斯市场似乎成了一个比较热门的话题&#xff0c;有人说今年我们大家应该主攻俄罗斯市场&#xff0c;现在俄罗斯…