代码随想录算法训练营43期 | Day 15——110.平衡二叉树、 257. 二叉树的所有路径、404. 左叶子之和、222. 完全二叉树的节点个数

news2024/11/26 5:00:09

代码随想录算法训练营

  • 代码随想录算法训练营43期 | Day 15
    • 110.平衡二叉树
    • 257. 二叉树的所有路径
    • 404. 左叶子之和
    • 222. 完全二叉树的节点个数

代码随想录算法训练营43期 | Day 15

110.平衡二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
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;
        //返回result
        int result;
        if(abs(rightheight-leftheight)>1)//左右子树高度大于1,不是平衡二叉树
        {
            return -1;
        }else
        {
            //返回自身节点和左右子树节点的最大值
            result = 1 + max(leftheight,rightheight);
        }
        return result;
    }
    bool isBalanced(TreeNode* root) {
        int result = getheight(root);
        if(result==-1)
        {
            return false;
        }else{
            return true;
        }
    }
};

257. 二叉树的所有路径

回溯算法:递归遍历顺序:前序遍历
递归三部曲:

  1. 确定递归函数的参数
  • void travalsal(Treenode* root, vector& path , vector& result)
  1. 确定函数的终止条件
  • 节点遇到叶子节点终止,也就是 if(node->leftnullptr&&node->rightnullptr) return result.push_back(path);
  1. 单层的递归逻辑
  • 这里使用vector 结构path来记录路径,所以要把vector 结构的path转为string格式,再把这个string 放进 result里。
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;
}

确定单层递归的逻辑:回溯和递归一一对应,一个递归对应一个回溯

if (cur->left) {
    traversal(cur->left, path, result);
    path.pop_back(); // 回溯
}
if (cur->right) {
    traversal(cur->right, path, result);
    path.pop_back(); // 回溯
}

在这里插入图片描述


class Solution {
public:
    // 1. 确定递归函数的参数和返回值
    void traversal(TreeNode*node, vector<int>&path, vector<string>&result)
    {
        //中左右,最后一个节点也要保存在里面
        path.push_back(node->val);
        //2.确定递归算法的终止条件 遇到叶子结点则返回
        if(node->left==nullptr&&node->right==nullptr)
        {
            string sPath;
            for (int i = 0; i < path.size() - 1; i++) {
                sPath += to_string(path[i]);
                sPath += "->";
            }
            sPath += to_string(path[path.size() - 1]);
            result.push_back(sPath);
            return;
        }
        //3. 单层递归的逻辑关系
        //左
        if(node->left)
        {
            traversal(node->left,path,result);
            path.pop_back();
        }
        //右
        if(node->right)
        {
            traversal(node->right,path,result);
            path.pop_back();
        }
    }

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

404. 左叶子之和

  1. 确定递归函数的参数和返回值
  2. 确定终止条件
  3. 确定单层递归的逻辑
class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        //1. 确定递归的终止条件
        if(root==nullptr) return 0;
        if(root->left==nullptr&&root->right==nullptr) return 0;
        //确定遍历顺序 中序遍历 左 根 右
        //确定单层遍历的逻辑顺序 左
        int leftval = sumOfLeftLeaves(root->left);
        if(root->left!=nullptr&&root->left->left==nullptr&&root->left->right==nullptr)
        {
            leftval =  root->left->val;
        }
        int rightval  = sumOfLeftLeaves(root->right);

        int sum = leftval + rightval;
        return sum;

    }
};

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

利用完全二叉树的特性进行计算节点个数

完全二叉树:
除了底层节点,上层的节点数量都是满的,且底层的节点是从左到右依次排序;

普通二叉树解法:

class Solution {
public:
    int getNodeNum(TreeNode* node)
    {
        //终止条件
        if(node==nullptr) return 0;
        //后序遍历
        int leftnum = getNodeNum(node->left);
        int rightnum = getNodeNum(node->right);
        int result = leftnum + rightnum + 1;
        return result;
    }
    int countNodes(TreeNode* root) {
        int result = getNodeNum(root);
        return result;
    }
};

完全二叉树解法:


class Solution {
public:
    //完全二叉树特性解法 、
    int getNums(TreeNode* node)
    {
        //确定递归的终止条件 节点为空,返回0
        if(node==nullptr) return 0;
        //确定是完全儿二叉树
        TreeNode* left = node->left;
        TreeNode* right = node->right;
        //深度
        int leftdepth = 0;
        int rightdepth = 0;
        //左子树 左子树不为空,循环往左,左子树深度++
        while(left)
        {
            left = left->left;
            leftdepth++;
        }
        //右子树
        while(right)
        {
            right = right->right;
            rightdepth++;
        }
        //判断是否是完全二叉树 
        if(rightdepth==leftdepth)
        {
            return (2<<leftdepth)-1;
        }
        //计算左
        int leftnum = getNums(node->left);
        //计算右
        int rightnum = getNums(node->right);
        return leftnum + rightnum + 1;
    }
    int countNodes(TreeNode* root) {
        return getNums(root);
    }
};

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

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

相关文章

【读点论文】Adaptive degraded document image binarization,真难复现,流程有点复杂

Adaptive degraded document image binarization Abstract 本文介绍了一种新的自适应方法&#xff0c;用于对退化文档进行二值化和增强。所提出的方法不需要用户进行任何参数调整&#xff0c;并且可以处理由于阴影、不均匀照明、低对比度、大信号相关噪声、污点和应变而发生的…

Spring 的 Aop 支持

Spring 的 Aop 支持 一、AOP基本概念1_AOP基本术语2_通知类型回顾3_AOP基于代理4_SpringBoot整合AOP 二、整体流程剖析1_AspectJAutoProxyRegistrar2_AnnotationAwareAspectJAutoProxyCreator1_继承结构2_初始化时机3_AnnotationAwareAspectJAutoProxyCreator的作用时机 3_收集…

【C++】_string类字符串详细解析(1)

假如没有给你生命&#xff0c;你连失败的机会都没有。你已经得到了最珍贵的&#xff0c;还需要抱怨什么!&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;什么是string&#xff1f; •&#x1f330;1.string类的概念 •&#x1…

嘉立创PCB4层板

视频&#xff1a; 四层板PCB设计保姆级教程&#xff08;1&#xff09;&#xff1a;3.0HUB设计概述_哔哩哔哩_bilibili&#xff08;虽然是四层板实际这个还是两层板&#xff01;&#xff09; 不太建议看这个。 四层PCB 最简单终教学 高校培训课程 深入浅出 不会电路也能学会 设…

Nginx的核心!!! 负载均衡、反向代理

目录 负载均衡 1.轮询 2.最少连接数 3.IP哈希 4.加权轮询 5.最少时间 6.一致性哈希 反向代理 测试 之前讲过Nginx 的简介和正则表达式&#xff0c;那些都是Nginx较为基础的操作&#xff0c;Nginx 最重要的最核心的功能&#xff0c;当属反向代理和负载均衡了。 负载均…

YOLOv8实例分割+双目相机实现物体尺寸测量

1&#xff0c;YOLOv8实例分割原理介绍 YOLOv8是YOLO系列的最新版本&#xff0c;它在目标检测和实例分割方面都进行了显著的改进和创新。以下是YOLOv8实例分割原理的一些关键点&#xff1a; 先进的骨干和颈部架构&#xff1a;YOLOv8采用了先进的骨干和颈部架构来提高特征提取和物…

分治,1875C - Jellyfish and Green Apple

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1875C - Jellyfish and Green Apple 二、解题报告 1、思路分析 n 个苹果…

小阿轩yx-Kubernetes Pod入门

小阿轩yx-Kubernetes Pod入门 前言 Kubernetes 中 一个重要的概念就是 Pod&#xff08;豆荚&#xff09;并不直接管理容器&#xff0c;它的最小管理单元叫做 Pod。 Docker 应用中 把一个应用程序封装在一个镜像中&#xff0c;之后启动这个镜像并映射个宿主机端口号&#x…

03、Redis实战:商户查询缓存、缓存更新策略、缓存穿透、缓存雪崩、缓存击穿

2、商户查询缓存 2.1 什么是缓存? 什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震器&qu…

2、Unity【基础】Mono中的重要内容

Unity基础 MonoBehavior中的重要内容 文章目录 Mono中的重要内容1、延迟函数1、延迟函数概念2、延迟函数使用3、延迟函数受对象失活销毁影响思考1 利用延时函数实现计时器思考2 延时销毁 2、协同程序1、Unity是否支持多线程2、协同程序概念3、协同程序和线程的区别4、协程的使用…

APP架构设计_1.官方应用架构指南

1.官方应用架构指南 1.1架构的原则 应用架构定义了应用的各个部分之间的界限以及每个部分应承担的职责。谷歌建议按照以下原则设计应用架构。 分离关注点通过数据模型驱动界面单一数据源单向数据流 1.2谷歌推荐的应用架构 每个应用应至少有两个层&#xff1a; 界面层 - 在屏…

近视防控明星:蔡司小乐圆中期临床数据详解

近视防控明星&#xff1a;蔡司小乐圆中期临床数据详解 小乐圆镜片作为近视防控镜片里的明星产品&#xff0c;从22年5月上市以来防控效果就一直备受大家的关注。而最近中期临床试验的结果&#xff0c;给家长孩子吃了一颗定心丸。 本次实验中&#xff0c;240位受试者被随机分成三…

基于springboot框架的电影订票系统_wqc3k

TOC springboot611基于springboot框架的电影订票系统_wqc3k--论文 绪 论 1.1研究背景和意义 随着科学技术的不断发展&#xff0c;计算机现在已经成为了社会的必需品&#xff0c;人们通过网络可以获得海量的信息&#xff0c;这些信息可以和各行各业进行关联&#xff0c;电影…

你应该停止使用的 7 个已弃用的 Python 库

欢迎来到雲闪世界。升级您的 Python 工具包&#xff1a;发现 7 个应停止使用的过时库以及替代它们的功能。最近&#xff0c;我回顾了 Python 的新特性&#xff0c;发现每个版本都引入了创新&#xff0c;使我们的日常开发工作变得更加轻松。 这让我意识到科技是一门永无止境的艺…

8.21 QT

1.思维导图 2. 服务器端 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer>//服务器类 #include <QMessageBox> #include <QDebug> #include <QList> #include <QTcpSocket>QT_BEGIN_NAMESPACE names…

免费高画质提取PPT/Word/Excel中的图片工具

下载地址&#xff1a;https://pan.quark.cn/s/134ccc35b8a2 软件简介&#xff1a; 好不容易搞到一个几十上百MB的ppt&#xff0c;想导出里面的图片进行二次加工&#xff0c;却被ppt超低画质的图片另存为功能劝退&#xff0c;明知里面全是高清图片&#xff0c;走时却是两手空空…

【C++从练气到飞升】14---深入浅出继承

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书&#x1f389; 目录 ⛳️推荐 一、继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承方式和访问限定符…

重新认识AbstractQueuedSynchronizer

开篇之前&#xff0c;烦请诸位允许我附庸风雅一次。近期因诸事繁杂&#xff0c;心情颇低落&#xff0c;遂于喜马拉雅APP中收听《老子》一文。其中的第八十一章《结天道》一文于我感悟颇深&#xff1a;和大怨&#xff0c;必有余怨&#xff0c;报怨以德&#xff0c;焉可以为善&am…

C++,std::bind 详解

文章目录 1. 概述2. 基本用法2.1 使用占位符2.2 示例 3. 总结 1. 概述 std::bind 是 C11 引入的一个功能&#xff0c;它允许你将函数&#xff08;或成员函数、函数对象&#xff09;与其参数绑定&#xff0c;生成一个新的可调用对象。这个功能在需要将函数及其参数一起传递给其…

DNF攻略:护石符文体系辅助详解,VMOS云手机助攻核心玩法!

在DNF游戏中&#xff0c;护石符文系统是提升角色实力的重要部分。当前版本中&#xff0c;护石符文体系经过了优化&#xff0c;使得获取方式更加便捷。以下是护石符文体系的详细介绍&#xff0c;以及如何使用VMOS云手机来更高效地管理和利用这一系统。 一、护石符文体系简介 护…