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

news2024/11/19 10:38:38

文章目录

    • 一、平衡二叉树
    • 二、[回溯小难]二叉树的所有路径
    • 三、左叶子之和

一、平衡二叉树

110.平衡二叉树
依旧是使用后序遍历来统计高度。

递归过程中,发现某节点的左右子树的高度差超过了1,我们就直接返回-1,不返回节点的高度了。

递归函数的参数和返回值:

int getHeight(TreeNode * node){}

终止条件:

if(node==nullptr) return 0;

单层递归逻辑:

如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?
当然是其左子树高度和其右子树高度的差值。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

int leftHeight = getHeight(node->left);   // 左
if (leftHeight == -1)
    return -1;
int rightHeight = getHeight(node->right); // 右
if (rightHeight == -1)
    return -1;

int res;
if (abs(leftHeight - rightHeight) > 1)  // 根
    res = -1;
else
{
    res = 1 + max(leftHeight, rightHeight);
}
return res;

完整代码:

class Solution
{
public:
    int getHeight(TreeNode *node)
    {
        if (node == nullptr)
            return 0;

        int leftHeight = getHeight(node->left); // 左
        if (leftHeight == -1)
            return -1;
        int rightHeight = getHeight(node->right); // 右
        if (rightHeight == -1)
            return -1;

        int res;
        if (abs(leftHeight - rightHeight) > 1)  // 根
            res = -1;
        else
        {
            res = 1 + max(leftHeight, rightHeight);
        }
        return res;
    }
    bool isBalanced(TreeNode *root)
    {
        return getHeight(root) == -1 ? false : true;
    }
};

二、[回溯小难]二叉树的所有路径

257.二叉树的所有路径

我们这里要使用前序遍历。

递归函数的参数和返回值:

void travelsal(TreeNode *node){}

递归终止条件:

if (node->left == nullptr && node->right == nullptr)

单层递归逻辑:

// 单层递归处理逻辑
// 左
if (node->left)
{
    travelsal(node->left);
    path.pop_back(); // 为啥在这里pop_back()? 这是回溯的过程
}
// 右
if (node->right)
{
    travelsal(node->right);
    path.pop_back(); // 为啥在这里pop_back()? 这是回溯的过程
}
class Solution
{
private:
    vector<string> res;
    vector<int> path;
    void travelsal(TreeNode *node)
    {
        path.push_back(node->val); // 中 写在这里? 因为最后一个叶子节点也要加入到path中
        if (node->left == nullptr && node->right == nullptr)
        {
            string s;
            for (int i = 0; i < path.size() - 1; i++)
            {
                s += to_string(path[i]);
                s += "->";
            }
            s += to_string(path[path.size() - 1]); // 记录最后一个节点(叶子节点)
            res.push_back(s);
            return;
        }
        // 中 本该写在这里
		//path.push_back(node->val);
        
        // 单层递归处理逻辑
        // 左
        if (node->left)
        {
            travelsal(node->left);
            path.pop_back(); // 为啥在这里pop_back()? 这是回溯的过程
        }
        // 右
        if (node->right)
        {
            travelsal(node->right);
            path.pop_back(); // 为啥在这里pop_back()? 这是回溯的过程
        }
    }

public:
    vector<string> binaryTreePaths(TreeNode *root)
    {
        travelsal(root);
        return res;
    }
};

1、为啥用前序?
这样才方便让父节点指向孩子节点,找到对应的路径。

2、为什么会有回溯?
因为我们要用vector装数据,然后要把数据弹出去一部分,方便递归其他路径。

三、左叶子之和

404.左叶子之和

使用后续遍历最为简洁。
判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
在这里插入图片描述
递归函数的参数和返回值:

int travelsal(TreeNode *node){}

终止条件:

 if (node == nullptr)
     return 0;

单层递归逻辑:

int leftnum = travelsal(node->left); // 左
if (node->left != nullptr && node->left->left == nullptr && node->left->right == nullptr)
    leftnum = node->left->val;
int rightnum = travelsal(node->right);// 右
int sum = leftnum + rightnum; // 中
return sum;

完整代码:

class Solution
{
public:
    int travelsal(TreeNode *node)
    {
        if (node == nullptr)
            return 0;

        int leftnum = travelsal(node->left);
        if (node->left != nullptr && node->left->left == nullptr && node->left->right == nullptr)
            leftnum = node->left->val;
        int rightnum = travelsal(node->right);
        int sum = leftnum + rightnum;
        return sum;
    }
    int sumOfLeftLeaves(TreeNode *root)
    {
        return travelsal(root);
    }
};

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

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

相关文章

C/C++开发,opencv与qt结合播放视频

目录 一、qt_ui创建 1.1 ui设置 1.2 ui及代码输出保存 二、创建工程 2.1 工程目录及编译设置 2.2 源码设计 三、编译及测试 3.1 程序编译 3.2 程序运行 首先声明&#xff0c;这是一个OpenCV 3学习文档的案例&#xff0c;但是说明有些过于省略&#xff0c;只有一些简短的代码…

ubuntu20.04终端中文显示乱码

我在配置好ubuntu20.04虚拟机以后&#xff0c;用xshell连接到终端&#xff0c;发现中文来不能显示&#xff0c;尝试过设置xshell的显示格式&#xff0c;不能解决问题。 经过研究&#xff0c;发现要修改ubuntu20.04本身的字体格式&#xff0c;解决方式如下&#xff1a; 1.修改~…

JavaBean

一、JavaBean的概念 1、JavaBean就是MVC设计模式中的model层 2、种类&#xff1a;数据bean&#xff08;pojo&#xff09;&#xff0c;逻辑bean 数据bean分为&#xff1a; 表单bean 封装表单里的参数&#xff0c;属性名字、个数和类型要和表单的参数的名字、个数和类型一致…

我对排序算法理解

排序算法一直是一个很困惑我的问题&#xff0c;早在刚开始接触 数据结构的时候&#xff0c;这个地方就很让我不解。就是那种&#xff0c;总是感觉少了些什么的感觉。一开始&#xff0c;重新来过&#xff0c;认真来学习这一部分&#xff0c;也总是学着学着就把概念记住了。过了一…

【Rust学习 | 基础系列3 | Hello, Rust】编写并运行第一个Rust程序

文章目录 前言一&#xff0c;创建项目二&#xff0c;两种编译方式1. 使用rustc编译器编译2. 使用Cargo编译 总结 前言 在开始学习任何一门新的编程语言时&#xff0c;都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中&#xff0c;将会介绍如何在Rust中编写并运…

Elasticsearch搜索引擎系统入门

目录 【认识Elasticsearch】 Elasticsearch主要应用场景 Elasticsearch的版本与升级 【Elastic Stack全家桶】 Logstash Kibana Beats Elasticsearch在日志场景的应用 Elasticsearch与数据库的集成 【安装Elasticsearch】 安装插件 安装Kibana 安装Logstash 【认…

Day01-作业(HTMLCSS)

作业1&#xff1a;通过HTML的标签及CSS样式&#xff0c;完成如下企业简介html页面的制作。 【必做】 A. 最终效果如下&#xff1a; B. 文字素材如下&#xff1a; 企业简介传智教育(股票代码 003032)&#xff0c;隶属江苏传智播客教育科技股份有限公司&#xff0c;注册资本4亿元…

【NVIDIA CUDA】2023 CUDA夏令营编程模型(一)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【Git】Git GitHub

1. Git1.1 Git基本操作1.2 Git版本回退1.3 Git分支操作 2. Git 配合GitHub2.1 生成密钥2.2 GitHub添加公钥2.3 Git连接GitHub2.4 本地仓库关联远程仓库2.5 本地代码push远程仓库2.6 本地clone远程仓库2.7 本地fetch和pull 1. Git 1.1 Git基本操作 touch test.py 工作区创建文…

全网最细,Postman接口测试实战详细总结,一篇进阶...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Postman是一款功能…

【力扣每日一题】2023.7.30 环形链表2

题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题属于是那种知道解法就很简单&#xff0c;不知道解法就很难独立想出来的那种&#xff0c;我们只需要稍微记住这类题的固定解法就可以。 所以接下来我先说解法&#xff0c;再解释为什么解法可以解出来。 那么我们都…

nginx使用-(想学nginx,这篇就够了)

nginx使用-&#xff08;想学nginx&#xff0c;这篇就够了&#xff09; upstream wgz{server 127.0.0.1:8081 ;server 127.0.0.1:8082 ;fair;}反向代理 动静分离 负载均衡 高可用集群配置 反向代理 upstream要转发的地址的配置proxy_pass请求转发的地址 location /user{proxy_…

程序设计 算法基础

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【并发专题】操作系统模型及三级缓存架构

目录 课程内容一、冯诺依曼计算机模型详解1.计算机五大核心组成部分2.CPU内部结构3.CPU缓存结构4.CPU读取存储器数据过程5.CPU为何要有高速缓存 学习总结 课程内容 一、冯诺依曼计算机模型详解 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时&#xff0c;先从内存中…

python学习之【浅拷贝】

前言 上一篇文章&#xff0c;python学习之【继承、封装、多态】主要学习了面向对象的三大特征。这篇文章记录下对python的浅拷贝的学习&#xff0c;下一篇文章接着学习深拷贝。 简单了解 浅拷贝&#xff1a;python拷贝一般都是浅拷贝&#xff0c;拷贝时&#xff0c;对象包含的…

【C语言】函数重难点之函数递归

大家好&#xff0c;我是深鱼~ 目录 一、函数递归知识讲解 1.什么是递归&#xff1f; 2.递归的两个必要条件 2.1练习1&#xff1a; 2.2练习2&#xff1a; 二、递归与迭代 2.1练习3 2.2练习4 一、函数递归知识讲解 1.什么是递归&#xff1f; 程序调用自身的编程技巧称为…

UNITY随记(八) SHADER实现立方体CUBE显示边框,描边

Shader "Vitens/CubeOutline"{Properties{_Color("Color", color) = (1,1,1,1)_Width("Width", range(0,0.5)) = 0.1}SubShader{Tags {"Queue"=

windows下载安装FFmpeg

FFmpeg是一款强大的音视频处理软件&#xff0c;下面介绍如何在windows下下载安装FFmpeg 下载 进入官网: https://ffmpeg.org/download.html, 选择Windows, 然后选择"Windows builds from gyan.dev" 在弹出的界面中找到release builds, 然后选择一个版本&#xff0…

Java中的生产者/消费者模型

一、什么是生产者/消费者模型 生产者-消费者模型&#xff08;Producer-Consumer problem&#xff09;是一个非常经典的多线程并发协作的模型。 比如某个模块负责生产数据&#xff0c;而另一个模块负责处理数据。产生数据的模块就形象地被称为生产者&#xff1b;而处理数据的模…

基地培训一周总结-用两台虚拟机模拟公司和员工

前言&#xff1a; 本来是打算每天跟更新所学内容&#xff0c;但奈何自己接触新知识速度较慢&#xff0c;每天都在完不成任务的边缘疯狂试探&#xff0c;短时间大量知识的涌入&#xff0c;感觉脑袋瓜在有点 跟不上。这周结束的时候&#xff0c;老师布置了个小项目&#xff0c;融…