代码随想录第十九天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和,222. 完全二叉树的节点个数

news2024/9/22 9:38:21

110. 平衡二叉树

第一想法:首先要明确平衡二叉树的定义?左右节点的高度差不超过1?不会概念感觉无法下手...

返回参数返回int,为了标记已经不是平衡二叉树,用-1作标记

int traversal(TreeNode* root){
        if(root==nullptr) return 0;
        //递归左孩子和右孩子
        int leftdepth = traversal(root->left);
        int rightdepth = traversal(root->right);
        //如果左右孩子有-1,直接返回-1
        if (leftdepth==-1) return -1;
        if(rightdepth==-1) return -1;
        int result = abs(leftdepth-rightdepth) > 1? -1:max(leftdepth, rightdepth)+1;
        //判断左右孩子是否为-1
        return result;
    }

    bool isBalanced(TreeNode* root) {
        if(root==nullptr) return true;
        int result = traversal(root);
        if(result == -1) return false;
        else return true;
    }

看完想法:概念差不多正确,完整的高度平衡的二叉树定义是:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1,迭代记录节点当前的高度,如果不是平衡二叉树的话,就记为-1

257. 二叉树的所有路径

第一想法:和普通递归一样,在push_back根节点以及左右孩子的If都不执行的时候,开始把string转化为result

看完想法:一般的递归是 root==nullptr 的时候处理递归逻辑,但是与题目不符,我们需要遇到叶子节点的时候就放入result。并且遍历的时候用path遍历,类型是vector<int>, str作为result的元素,是一个暂存元素的中间变量。其中,把其他元素转变为string可以用to_string( )库函数。在执行递归回溯时,str的弹出(vector)可以用pop_back();

终止逻辑如下:

if (cur->left == NULL && cur->right == NULL) { // 遇到叶子节点
    string sPath;
    for (int i = 0; i < path.size() - 1; i++) { // 将path里记录的路径转为string格式
        sPath += to_string(path[i]);
        sPath += "->";
    }
    sPath += to_string(path[path.size() - 1]); // 记录最后一个节点(叶子节点)
    result.push_back(sPath); // 收集一个路径
    return;
}

完整版

void traversal(TreeNode* root, vector<int>& str, vector<string>& result){
        //中,提前放入str
        str.push_back(root->val);
        if(root->left == nullptr && root->right == nullptr) {
            //终止条件
            string path;
            for(int i = 0; i<str.size()-1; i++){
                path += to_string(str[i]); 
                path += "->";
            }
            path += to_string(str[str.size()-1]);
            result.push_back(path);
        }
        //递归规则
        if(root->left) {
            traversal(root->left, str, result);
            str.pop_back();
            }
        if(root->right) {
            traversal(root->right, str, result);
            str.pop_back();
        }

    }  
    
    
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        vector<int> str;
        if(root==nullptr) return result;
        traversal(root, str, result);
        return result; 

404.左叶子之和

第一想法:重点判断是不是左叶子,需要通过父节点来判断是不是左叶子。具体来说,当前遍历节点的左节点没有孩子并右节点有孩子,就是左叶子

看完想法:忽略了一点,最后需要求左子树的左叶子之和和右子树的左叶子之和才行,因此递归函数返回值应该是Int,,判断是不是叶子节点需要放在递归逻辑模块里

222. 完全二叉树的节点个数

第一想法:用最大深度的解法去解完全ok,但是达不到理想的时间复杂度。不知道咋利用完全二叉树的个性

看完想法:完全二叉树:除了底层节点没满,其余节点都满了,并且底层节点都集中在树的左侧,节点不连续排列不是完全二叉树!

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

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

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。怎么判断是否为满二叉树,看左侧深度和右侧深度是否相同,同就是满二叉树;并且没有遍历中间节点,在二叉树很大的时候节约了很多时间成本.

在写终止条件时,要判断是否先等,不同则继续迭代;写递归逻辑时仍然要返回result

int result = 0;
    int traversal(TreeNode* root){
        if(root==nullptr) return 0;
        int leftdepth=0;
        int rightdepth=0;
        //记录左右侧深度,从0开始
        TreeNode* left = root->left;
        TreeNode* right = root->right;
        while(left){
            left = left->left;
            leftdepth++;
        }
        while(right){
            right = right->right;
            rightdepth++;
        }
        if(leftdepth==rightdepth){
            return (2<<leftdepth)-1;
        }
        //遍历逻辑
        int leftnode = traversal(root->left);
        int rightnode = traversal(root->right);
        result = leftnode + rightnode +1; 
        return result;
    }
    int countNodes(TreeNode* root) {
        if(root==nullptr) return 0;
        result = traversal(root);
        return result;

    }

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

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

相关文章

Linux_kernel烧写Uboot02

一、温故知新 1、开发环境 Ubuntu的Linux操作系统(18.04 20.04 22.04) 前面的版本号是双数&#xff0c;后面的版本号是04 lsb_release -a 用于查看系统版本号 uname -a 查看系统位数/内核版本号 2、体系架构 APP 各种控制界面\通…

数据库 变更和版本控制管理工具 --Bytebase 安装部署

数据库 变更和版本控制管理工具 --Bytebase 安装部署 文章目录 数据库 变更和版本控制管理工具 --Bytebase 安装部署前言一.Docker部署Bytebase1.Docker 配置2. pull 数据3. 执行部署4. 打开浏览器 部署完成 二、使用步骤1.注册超管2.配置 Configure External URL 总结 前言 B…

点餐收银小程序

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《点餐收银小程序》。 系统含管理员/商家/用户三种角色&#xff0c;商家能维护菜式类别、维护菜品信息&#xff0c;用户在小程序能够选择门店&#xff0c;查看门店下各个分类的菜式信息&#xff0c;并进行加购…

【vSphere 7/8】深入浅出 vSphere 证书 Ⅲ—— vSphere 证书的更新和替换概述

目录 摘要1. vSphere Certificate Architecture2. 证书更新和替换概述2.1更新 VMCA 签名的证书&#xff08;1&#xff09;使用 vSphere Client UI&#xff08;2&#xff09;使用 vSphere Certificate Manager 命令行工具&#xff08;自动&#xff09;&#xff08;3&#xff09;…

行业大模型元年,“有云处皆智能”的愿景还有多远?

打造新质生产力、推动高质量发展&#xff0c;已成为众多行业用户在数字经济时代的一道必答题。 今年《政府工作报告》就提出要深化大数据、人工智能等研发应用&#xff0c;开展“人工智能”行动&#xff0c;大力推进现代化产业体系建设&#xff0c;加快发展新质生产力。这其中…

IBM是中国IT界的黄埔军校

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 我第一次听说IBM还是小的时候&#xff0c;当时很多人都说IBM是厉害&#xff0c;外号“蓝色巨人”&#xff0c;潜移默化我也知道IBM牛了。 而且当年我买的第一款笔记本电脑就是IBM的ThinkPad系列&#xff0c;花了6…

Python酷库之旅-第三方库Pandas(112)

目录 一、用法精讲 491、pandas.DataFrame.cumsum方法 491-1、语法 491-2、参数 491-3、功能 491-4、返回值 491-5、说明 491-6、用法 491-6-1、数据准备 491-6-2、代码示例 491-6-3、结果输出 492、pandas.DataFrame.describe方法 492-1、语法 492-2、参数 492…

中国书法艺术孙溟㠭浅析《平复帖》

中国书法艺术孙溟㠭浅析《平复帖》 《平复帖》是西晋文学家、书法家陆机创作的书法作品&#xff0c;纵23.8厘米、横20.5厘米&#xff0c;共九行、八十四字&#xff0c;是陆机写给久病未愈朋友的问候信札&#xff0c;因其中有“恐难平复”字样&#xff0c;故得“平复帖”之名。 …

【C++ 面试 - STL】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

2024最新最全:【计算机自学网站】大全,零基础入门到精通,看完这一篇就够了!

分享32个鲜为人知并且完全免费的高质量自学网站&#xff0c;每个都是堪称神器&#xff0c;让你相见恨晚。 1&#xff1a;Oeasy 是一个完全免费的综合视频教程网站&#xff0c;非常良心实用。 它提供的视频教程非常丰富并且质量很高&#xff0c;包括&#xff1a;PS 教程、手机…

通过 TS-Mixer 实现股票价格预测

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 最近遇到了 Time Mixer 模型,该模型以在复杂数据集上提供令人印象深刻的结果而闻名。出于好奇,我决定将其应用于我在 Kaggle 上找到的数据集,其中包含 Microsoft 的历史股票价格。在本文中,我…

盘点免费且靠谱的AI大模型 API,统一封装,任性调用!

现在做大模型&#xff0c;还有靠谱且免费的 API 接口吗? 靠谱的不免费&#xff0c;免费的不靠谱&#xff0c;鱼和熊掌不可兼得&#xff1f; 非也&#xff01; 对于简单的指令而言&#xff0c;绝大部分免费的 LLM API 还是能打的&#xff0c;本文就给大家介绍几款&#xff0…

22.缓存雪崩缓存击穿

定义 同一时段大量的缓存key同时失效或者redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案 1.给不同key的TTL添加随机值。 2.利用redis集群提高服务的可用性。 3.给缓存业务添加降级限流策略。 4.给业务添加多级缓存。 缓存击穿 缓…

Redis持久化方式、常见问题及解决方案

在现代电商交易系统中&#xff0c;Redis作为一种高性能的内存数据库&#xff0c;被广泛用于缓存和数据持久化。然而&#xff0c;Redis作为内存数据库&#xff0c;面临着数据持久化和数据与持久化存储如MySQL之间的一致性问题。本文将详细讲解Redis的持久化方式、常见问题及其解…

常见框架报错信息

一、报错信息&#xff08;不同类型转换&#xff09; 2024-08-28 14:57:15.450 ERROR 8272 --- [io-8080-exec-12] c.w.common.exception.RRExceptionHandler : class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer ar…

IO进程练习:请在linux 利用c语言编程实现两个线程按照顺序依次输出”ABABABAB......“

例如&#xff1a;a线程输出”A”之后b线程输出”B”&#xff0c;然后a线程输出“A”&#xff0c;再b线程输出”B”&#xff0c;之后往复循环。 【1】使用信号量实现 代码展示&#xff1a; #include <stdio.h> #include <pthread.h> #include <string.h> #inc…

Java 输入与输出之 NIO.2【AIO】【Path、Paths、Files】【walkFileTree接口】探索之【三】

在JDK 1.7 版本中对NIO进行了完善&#xff0c;推出了NIO.2&#xff0c;也称为AIO&#xff08;异步IO&#xff09;&#xff0c;在处理大量并发请求时具有优势&#xff0c;特别是在网络编程和高并发场景下&#xff0c;表现得更为出色。 对于输出流和输入流而言&#xff0c;操作的…

sipp模拟uas发送update

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 但是fs在处理update消息时候有BUG&#xff0c;为了复现问题&#xff0c;使用sipp模拟uas&#xff0c;发送update并发送DTMF码。 本文档记录sipp的配置方案。 环境 CentOS 7.9 freeswitch 1.10.7 sipp.3.6.2 问题描…

【Hexo系列】【6】NexT主题使用

本期将为大家讲解Hexo NexT主题的使用。 1. NexT介绍 NexT是Hexo的知名第三方主题&#xff0c;黑白极简风格四合一&#xff0c;有相当多的使用者&#xff0c;维护也相当给力&#xff0c;数年来一直都在频繁更新。 Next主题官网&#xff1a;https://github.com/next-theme/he…

Mysql基础练习题 584.寻找用户推荐人 (力扣)

找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 建表插入数据&#xff1a; Create table If Not Exists Customer (id int, name varchar(25), referee_id int) Truncate table Customer insert into Customer (id, name, referee_id) values (1, Will, None) insert int…