算法日记 13 day 二叉树

news2024/11/25 6:30:05

今天继续二叉树啊!!!

题目:平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode)

给定一个二叉树,判断它是否是 平衡二叉树

   题目分析:

        平衡二叉树指的是一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

在之前的题中,我们做过了求树的最大深度,不过我们使用的是求高度的写法,通过后序遍历的方式将子节点的高度返回给父节点。同样的,平衡二叉树的判断也是这种方式。

public class Solution {
    public bool IsBalanced(TreeNode root) {
        return (GetHeight(root)==-1)?false:true;
    }
    public int GetHeight(TreeNode root){
        if(root==null) return 0;
        int left=GetHeight(root.left);//使用后序遍历,这样能够将子节点的信息返回给父节点
        if(left==-1) return-1;
        int right=GetHeight(root.right);
        if(right==-1) return-1;
        int res;
        if(Math.Abs(left-right)>1)//左右子树的高度差
        {
            res=-1;
        }
        else
        {
            res=1+Math.Max(left,right);
        }
        return res;
    }
}

 题目:二叉树的所有路径

257. 二叉树的所有路径 - 力扣(LeetCode)

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]
 题目分析:       

这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。

在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。记住回溯是需要回退的。

回溯的本质其实就是递归,所以写法上和递归差不多。

public class Solution {
    public IList<string> BinaryTreePaths(TreeNode root) {
        List<int> path=new List<int>();
        List<string> res=new List<string>();
        if (root == null) return res;
        BrackTracing(root,path,res);
        return res;
    }
    public void BrackTracing(TreeNode root,List<int> path,List<string> res)
    {
        path.Add(root.val);//记录当前的节点
        if(root.right==null&&root.left==null)//叶子节点
        {
            string str="";
            for(int i=0;i<path.Count-1;i++){
                str+=path[i].ToString();
                str+="->";
            }
            str+=path[path.Count-1].ToString();
            res.Add(str);
        }
        if(root.left!=null){
            BrackTracing(root.left,path,res);
            path.RemoveAt(path.Count-1);//回退一个节点
        }
        if(root.right!=null){
            BrackTracing(root.right,path,res);
            path.RemoveAt(path.Count-1);
        }
    }
}

题目:左叶子之和

404. 左叶子之和 - 力扣(LeetCode)

给定二叉树的根节点 root ,返回所有左叶子之和。

示例 1:

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
题目分析: 

        这个左叶子是指节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。所有我们应该是通过父节点去判断左子节点是否为左叶子节点

public class Solution {
    public int SumOfLeftLeaves(TreeNode root) {
        if(root==null) return 0;

        int left=SumOfLeftLeaves(root.left);
        if (root.left!=null && root.left.left==null && root.left.right==null){// 左子树就是一个左叶子的情况
            left+=root.left.val;
        }
        int right=SumOfLeftLeaves(root.right);

        int sum=left+right;
        return sum;
    }
}

 题目:完全二叉树的节点个数

222. 完全二叉树的节点个数 - 力扣(LeetCode) 

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

题目分析:

        题目提供的是完全二叉树。那么对于完全二叉树而言。

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

public class Solution {
    public int CountNodes(TreeNode root) {
        if(root==null) return 0;
        TreeNode left=root.left;//左子树
        TreeNode right=root.right;
        int leftDepth=0;//左子树深度
        int rightDepth=0;
        while(left!=null){//求出左子树的深度
            left=left.left;
            leftDepth++;
        }
        while(right!=null){//求出右子树的深度
            right=right.right;
            rightDepth++;
        }
        if(rightDepth==leftDepth)//左右深度相同,是一个满二叉树
        {
            return (int)Math.Pow(2,leftDepth+1)-1;
        }
        return CountNodes(root.left)+CountNodes(root.right)+1;
    }
}

 

对于更详细的解析与其他语言的代码块,可以去代码随想录上查看。

代码随想录 (programmercarl.com)

已刷题目:41

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

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

相关文章

「C/C++」C/C++ 之 动态内存分配

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

人工智能_神经网络103_感知机_感知机工作原理_感知机具备学习能力_在学习过程中自我调整权重_优化效果_多元线性回归_逻辑回归---人工智能工作笔记0228

由于之前一直对神经网络不是特别清楚,尤其是对神经网络中的一些具体的概念,包括循环,神经网络卷积神经网络以及他们具体的作用,都是应用于什么方向不是特别清楚,所以现在我们来做教程来具体明确一下。 当然在机器学习之后还有深度学习,然后在深度学习中对各种神经网络的…

idea使用Translation插件实现翻译

1.打开idea&#xff0c;settings&#xff0c;选择plugins&#xff0c;搜索插件Translation&#xff0c;安装 2.选择翻译引擎 3.配置引擎&#xff0c;以有道词典为例 3.1 获取应用ID&#xff0c;应用秘钥 3.1.1 创建应用 点击进入有道智云控制台 3.1.2 复制ID和秘钥 3.2 idea设…

Mac下载 安装MIMIC-IV 3.0数据集

参考blog MIMIC IV 3.0数据库安装方法_mimic数据下载-CSDN博客 MIMIC IV数据库安装&#xff08;二&#xff09;_mimic数据库安装-CSDN博客 MIMIC-IV3.0安装_mimic iv 3.0-CSDN博客 MIMIC-IV-v2.0安装教程_mimic iv 安装教程-CSDN博客 MIMIC IV 3.0数据库安装方法或者思路&…

力扣——另一个的子树(C语言)

1.题目&#xff1a; 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree …

为什么说Tcp是面向字节流的以及(Tcp粘包问题、TCP/UDP对比、listen函数的backlog参数的意义)

为什么说Tcp是面向字节流的&#xff1a; Tcp通信的本质是创建一个tcp的socket&#xff0c;同时就会对应的创建一个发送缓冲区和接收缓冲区。 调用write时, 数据会先写入发送缓冲区中;如果发送的字节数太长, 会被拆分成多个TCP的数据包发出如果发送的字节数太短, 就会先在缓冲…

92.【C语言】数据结构之单向链表的查找,中间插入和删除,销毁

目录 1.链表的查找函数 2.链表的修改函数 3.链表的中间插入函数 1.在pos之前插入:SLTInsertBefore函数 1.借助头指针pphead 示意图 代码示例(写入SList.c) 头文件添加SLTInsertbefore的声明 main.c的部分代码改为 1.测试中间插入 2.测试头部插入 3.测试pos为NULL的…

无人机救援系统基本组成

无人机救援系统基本组成 1. 源由2. 组成2.1 无人机载具2.1.1 多旋翼2.1.2 垂起固定翼2.1.3 智能避障2.1.4 物资投递 2.2 智能吊舱2.2.1 云台2.2.2 高清摄像2.2.3 红外热成像2.2.4 激光测距2.2.5 目标跟踪 2.3 通讯链路2.3.1 超长距离通信2.3.2 长距离通信2.3.3 中等距离通信 2.…

普通高考预报名上传蓝底证件照手机自拍方法详解

普通高考预报名过程中&#xff0c;上传一张合规的蓝底证件照是必不可少的一步。本文将详细介绍如何使用手机自拍并使用工具来制作符合要求的蓝底证件照。注意&#xff0c;目前仅有广东等个别省份允许特定类型考生使用自拍照上传&#xff08;例如普高预报名阶段、学考报名&#…

linux 原子操作

首先是为什么要有 原子操作 网上的截图&#xff1a; 不能从C语言来看&#xff0c;要从汇编来看 但是实际的情况有可能是这样。 A进程没有得到想要的结果。 然后是 原子操作的 底层实现 最终会是这段代码&#xff0c;当然只是一个 加一的操作。 static inline void atomic_a…

ComfyUI新神器ComfyUI-Detail-Daemon:一键提升AI绘画细节,Flux模型画质再升级

近日&#xff0c;一款名为ComfyUI-Detail-Daemon的革命性插件正在AI绘画圈引起轰动。这款由Jonseed开发的工具&#xff0c;巧妙地将sd-webui-Detail-Daemon移植到ComfyUI平台&#xff0c;为创作者们带来了前所未有的细节优化体验。 这款插件最引人注目的特点是其强大的细节增强…

Qt/C++地图导航app/支持qml/手机运行/输入起点终点规划路径/模拟轨迹移动

一、前言说明 搞Qt地图开发这块&#xff0c;随着研究的深入&#xff0c;用户的需求变化&#xff0c;最近又需要在手机上运行&#xff0c;由于本地图组件依赖浏览器控件&#xff0c;而手机安卓上的Qt并没有带qwebengine控件&#xff0c;怎么办呢&#xff0c;不断的努力验证下&a…

优优嗨聚集团:正确了解个人债务过多的危害

在当今社会&#xff0c;随着消费观念的转变和金融产品的多样化&#xff0c;个人债务问题日益凸显。许多人为了追求更高的生活质量或应对突发情况&#xff0c;不自觉地陷入了债务的泥潭。然而&#xff0c;个人债务过多不仅会影响个人的财务状况&#xff0c;还可能对生活和心理产…

Pycharm,2024最新版Pycharm现在安装环境配置汉化详细教程!

码&#xff08;文末附带精品籽料&#xff09;&#xff1a; K384HW36OBeyJsaWNlbnNlSWQiOiJLMzg0SFczNk9CIiwibGljZW5zZWVOYW1lIjoibWFvIHplZG9uZyIsImxpY2Vuc2VlVHlwZSI6IlBFUlNPTkFMIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IiIsIm…

聚水潭数据集成MySQL:高效组合装商品查询案例

聚水潭数据集成到MySQL&#xff1a;组合装商品查询案例分享 在现代企业的数据管理中&#xff0c;如何高效、准确地实现不同系统之间的数据集成是一个关键问题。本文将聚焦于一个具体的技术案例&#xff1a;将聚水潭的组合装商品数据集成到MySQL数据库中&#xff0c;以便在BI狄…

MYSQL多表查询、函数、索引和事务思维导图

MySQL多表查询和函数 MySQL窗口函数 MySQL循环、游标、索引、事务

Vue3 学习笔记(八)Vue3 语法-Class 与 Style绑定详解

在 Vue.js 中&#xff0c;动态地绑定 CSS 类和样式是一项常见的需求。Vue 提供了几种不同的方法来实现这一点&#xff0c;包括对象语法、数组语法和组件的作用域插槽。 以下是这些方法的详细说明&#xff1a; 一、Class 绑定 1、对象语法 对象语法允许根据表达式的真值动态地切…

头歌——人工智能(机器学习 --- 决策树2)

文章目录 第5关&#xff1a;基尼系数代码 第6关&#xff1a;预剪枝与后剪枝代码 第7关&#xff1a;鸢尾花识别代码 第5关&#xff1a;基尼系数 基尼系数 在ID3算法中我们使用了信息增益来选择特征&#xff0c;信息增益大的优先选择。在C4.5算法中&#xff0c;采用了信息增益率…

WPF+Mvvm案例实战(五)- 自定义雷达图实现

文章目录 1、项目准备1、创建文件2、用户控件库 2、功能实现1、用户控件库1、控件样式实现2、数据模型实现 2、应用程序代码实现1.UI层代码实现2、数据后台代码实现3、主界面菜单添加1、后台按钮方法改造&#xff1a;2、按钮添加&#xff1a;3、依赖注入 3、运行效果4、源代码获…

【CSS】——基础入门常见操作

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;CSS引入 二&#xff1a;CSS对元素进行美化 1&#xff1a;style修饰 2&#xff1a;选…