代码随想录算法训练营第十七天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

news2024/11/15 17:51:09

打卡第17天,补卡中,懒狗又歇了几天。

今日任务

  • 110.平衡二叉树
  • 257.二叉树的所有路径
  • 404.左叶子之和

110.平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码随想录

后序遍历求高度,如果遇到左右高度相差大于1,返回-1,做标记,直接结束。

class Solution {
public:
    int getHight(TreeNode* root) {
        if(root == NULL) return 0;

        int lHight = getHight(root->left);
        if(lHight == -1) return -1;
        int rHight = getHight(root->right);
        if(rHight == -1) return -1;

        return abs(lHight - rHight) > 1 ? -1 : max(rHight, lHight) + 1;
    }
    bool isBalanced(TreeNode* root) {
        return getHight(root) == -1 ? false: true;
    }
};

257.二叉树的所有路径

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

在这里插入图片描述
在这里插入图片描述

我的题解

不知道怎么绕出来了。

class Solution {
public:
    void work(TreeNode *node, vector<vector<int> > &res,vector<int> &path) {
        //递归出口
        if(node == nullptr) return ;
        //访问结点,收集结点
        path.push_back(node->val);
        //左
        work(node->left, res, path);
        //右
        work(node->right, res, path);

        if(node->left == nullptr && node->right == nullptr) {
            //收集答案
            res.push_back(path);
        }
        //回溯弹出收集的结点
        path.pop_back();
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<vector<int> > res;
        vector<int> path;
        work(root, res, path);
        vector<string> str(res.size());
        for(int i = 0; i < res.size(); i++) {
            for(int j = 0; j < res[i].size(); j++) {
                if(j != 0) str[i] += "->";
                str[i] += to_string(res[i][j]);
            }
        }
        return str;
    }
};

代码随想录

我们需要遍历来保存每一个结点,记录路径,回溯回退一个路径进入另一个路径。
在这里插入图片描述

class Solution {
public:
    void traversal(TreeNode* node, vector<int> &path, vector<string> &res) {
        
        path.push_back(node->val); //中,收集结点
        
        // 到叶子结点,收集结构,出口
        if(node->left == NULL && node->right == NULL) {
            string sPath;
            for(int i = 0; i < path.size(); i++) {
                if(i != 0) sPath += "->";
                sPath += to_string(path[i]);
            }
            res.push_back(sPath);
            return ;
        }
        //左
        if(node->left) {
            traversal(node->left, path, res); //一直递归
            path.pop_back(); //回溯,回退结点
        } 
        
        //右
        if(node->right) {
            traversal(node->right, path, res); //一直递归
            path.pop_back(); //回溯,回退结点
        } 
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> res;
        vector<int> path;
        if(root) traversal(root, path, res);
        return res;
    }
};

404.左叶子之和

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

在这里插入图片描述

代码随想录

递归法
  1. 确定递归函数的参数和返回值
    判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int。使用题目中给出的函数就可以了。
  2. 确认递归出口,当传入结点为空,说明左叶子指一定为空。
    if(root == NULL) return 0;
    
    注意,只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。 所以如果当前遍历的节点是叶子节点,那其左叶子也必定是0,那么终止条件为:
    if(root == NULL) return 0;	
    if(root->left == NULL && root->right == NULL) return 0;
    
  3. 确定单层递归的逻辑
    当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if(root == nullptr) return 0;

        int l = sumOfLeftLeaves(root->left);
        if(root->left && !root->left->left && !root->left->right) l += root->left->val; 
        int r = sumOfLeftLeaves(root->right);

        return l + r;
    }
};
迭代法

本题迭代法使用前中后序都是可以的,只要把左叶子节点统计出来,就可以了。

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        stack<TreeNode*> st;
        if (root == NULL) return 0;
        st.push(root);
        int result = 0;
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
                result += node->left->val;
            }
            if (node->right) st.push(node->right);
            if (node->left) st.push(node->left);
        }
        return result;
    }
};

这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。

此时就要通过节点的父节点来判断其左孩子是不是左叶子了。

平时我们解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。

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

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

相关文章

(全网最详细)Mysql下载安装和配置方法(看了必成功)

Mysql下载 MySQL官网下载地址&#xff1a;MySQL 点击进行下载 解压到你想要安装的目录 新建my.ini文件复制以下内容粘贴进去修改basedir安装的目录&#xff0c;datadir安装的目录\data [mysqld] #设置3306端口 port3306 #设置mysql的安装目录 basedir #设置mysql数据库的数据…

KubeSphere 社区双周报 | OpenFunction v1.0.0-rc.0 发布

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.02.17-2023.…

idea插件推荐

idea插件推荐代码辅助GitHub CopilotAlibaba Cloud AI Coding AssistantTabnine AI Code Completion- JS Java Python TS Rust Go PHP & MoreiCodeJFormDesigner :图形用户界面生成器开发插件Mybatis HelperMaven HelperJPA Supportjava插件ptgGsonFormatPlusFastHotSwappe…

kibana查看日志

一、背景 kibana收集日志功能很强大&#xff0c;之前只是简单的使用&#xff0c;此次系统学习了解并分享一波 二、kibana查看日志的基本使用 1.选择查询的服务和日志文件 注意&#xff1a;每个应用配置了开发与生产环境&#xff0c;需要找到指定的应用 1.1选择对应的应用 1.…

wxpython设计GUI:wxFormBuilder工具常用布局结构介绍之布局四—面板拼接式

python借助wxFormBuilder工具搭建基础的GUI界面—wxFormBuilder工具使用介绍&#xff1a;https://blog.csdn.net/Logintern09/article/details/126685315 布局四&#xff1a;面板拼接式&#xff0c;先Panel面板构图&#xff0c;再使用程序代码在Frame框架上拼接面板 下面讲一下…

SurfaceFlinger模块

SurfaceFlinger是一个系统服务&#xff0c;作用就是接受不同layer的buffer数据进行合成&#xff0c;然后发送到显示设备进行显示。SurfaceFlinger进程是什么时候起来的&#xff1f;在之前的Android低版本手机上&#xff0c;SurfaceFlinger进程是在init.rc中启动的&#xff0c;在…

.Net Core WebApi 在Linux系统Deepin上部署Nginx并使用(一)

前言&#xff1a; Deepin最初是基于Ubuntu的发行版 2015年脱离Ubuntu开发&#xff0c;开始基于Ubuntu上游Debian操作系统 2019年脱离Debian&#xff0c;直接基于Linux开发&#xff0c;真正属于自己的上游Linux系统发行版 2022年8月&#xff0c;新版《Deepin V23》我下载开始了我…

Registry与DGC的攻击利用

0x01 2022-02-03写的一篇文章。 0x02 Registry Registry指的是RMI的注册表&#xff0c;攻击的目标是注册表所在的机器&#xff0c;一般注册表和RMI Server在同一个机器上&#xff0c;特殊情况下也会在不同机器上。 在我们通过LocateRegistry#getRegistry获取到目标开启的注…

Win32:C++其实早已支持中文编程

我们以前学习C/C的时候&#xff0c;对于变量和标识符的命名都有如下规则&#xff1a; 变量名必须由字母、数字、下划线构成只能以字母、下划线开头 似乎对中文不太友善啊&#xff0c;于是后来出现了一些中文编程的呼声&#xff0c;甚至还真的出现了一些中文编程语言。 其实在…

【微信小程序-原生开发】实用教程15 - 列表的排序、搜索(含云数据库常用查询条件的使用方法,t-search 组件的使用)

请先完成列表数据的分页、触底加载 【微信小程序-原生开发】实用教程14 - 列表的分页加载&#xff0c;触底加载更多&#xff08;含无更多数据的提醒和显示&#xff0c;自定义组件&#xff09; https://blog.csdn.net/weixin_41192489/article/details/129355396 效果预览 核心…

嵌入式 Linux进程间的通信--信号

目录 信号 信号的概述 信号类型 信号发送 1、kill 函数 2、raise函数 3、pause函数 信号处理 可以结合上一篇文章一起看&#xff1a; 嵌入式 Linux进程之间的通信_丘比特惩罚陆的博客-CSDN博客 信号 信号的概述 软中断信号&#xff08;signal&#xff0c;又简称为…

软聚类算法:模糊聚类 (Fuzzy Clustering)

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 在介绍模糊聚类之前&#xff0c;我们先简单地列举一下聚类算法的常见分类&#xff1a; 硬聚类 (Hard Clustering) Connec…

NGINX学习笔记 - 一篇了解NGINX的基本概念(一)

NGINX是什么&#xff1f; NGINX是一款由俄罗斯人伊戈尔赛索耶夫使用C语言开发的、支持热部署的、轻量级的WEB服务器/反向代理服务器/电子邮件代理服务器&#xff0c;因为占用内存较少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;所以在互联网项目中广泛应用。可…

十二、面向切面编程AOP

IoC使软件组件松耦合。AOP让你能够捕捉系统中经常使用的功能&#xff0c;把它转化成组件。 AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;面向方面编程。&#xff08;AOP是一种编程技术&#xff09; AOP是对OOP的补充延伸。 …

互联互通新里程,数字城轨助力城市繁荣!

轨道交通是城市间互通互联的命脉&#xff0c;是当下人们出行的首要选择之一&#xff0c;也是我国“新基建”的重点建设对象。将城轨交通各链路系统及多类型服务&#xff0c;与空间感知、移动互联、云计算等技术深度融合&#xff0c;集中实现城市空间、城轨分布、城轨运行动态的…

有哪些平价好用的台灯推荐?台灯买什么光的比较好

随着社会的发展&#xff0c;生产水平逐渐提高&#xff0c;很多东西都得到长足的发展&#xff0c;对咱们的生活水平的提高帮助也越来越大&#xff0c;台灯也不例外。台灯是现在各个年龄段人群都在使用的产品&#xff0c;晚上熬夜工作、学习、看书、休闲等等都很合适&#xff0c;…

Linux学习第十七节-Apache httpd的web服务

1.简介 适用于Unix/Linux下的web服务器软件。 Apache httpd&#xff08;开源且免费&#xff09;&#xff0c;虚拟主机&#xff0c;支持HTTPS协议&#xff0c;支持用户认证&#xff0c;支持单个目录的访问控制&#xff0c;支持URL地址重写&#xff0c;支持路径别名&#xff0c;…

北斗RTK高精度定位在AI领域的应用

随着北斗高精度定位技术越来越成熟&#xff0c;通过GNSS高精度定位与机器人结合&#xff0c;越来越多的智能机器人走进我们生活中。像驾培机器人、智能除草机器人、智能巡检机器人、北斗划线机器人等智能机器人已经广泛的投入使用。驾培机器人驾培机器人&#xff1a;通考车安装…

java基础——类加载机制

类加载机制一、背景知识补充二、类加载过程/机制1、浅层理解2、大致步骤3、具体步骤&#xff08;3.1&#xff09;装载loading&#xff1a;查找和导入相应的class文件&#xff08;3.2&#xff09;链接linking&#xff1a;把类的二进制数据合并到JRE中&#xff08;3.3&#xff09…

计算机的操作系统

目录 ❤ 什么是操作系统? ❤ 什么是文件? ❤ 什么是应用程序? ❤ 为什么要有操作系统? ​❤ 操作系统有什么用? ❤ 操作系统和应用程序的启动 python从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129328397?spm1001.201…