(第29天)【leetcode题解】222、完全二叉树的节点个数 110、平衡二叉树 257、二叉树的所有路径

目录

  • 222、完全二叉树的节点个数
    • 题目描述
    • 思路
    • 代码
  • 110、平衡二叉树
    • 题目描述
    • 思路
    • 代码
  • 257、二叉树的所有路径
    • 题目描述
    • 思路
    • 代码
  • 总结

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

题目描述

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

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

思路

  1. 题目分析
  • 可以把完全二叉树分为两种情况:完全二叉树、满二叉树
  • 若是满二叉树:则向左递归和向右递归获得的深度一样;直接用公式2depth-1计算节点个数
  • 若是完全二叉树:向左向右递归知道遇到当前节点下的二叉树为满二叉树,然后根据公式计算节点个数后返回
  1. 递归法
  • 参数:root入口函数时代表根节点,递归中代表当前节点
  • 返回值:int返回节点个数
  • 终止条件:当前节点为空时,返回0;当前根节点所在二叉树为满二叉树时,用公式计算当前二叉树个数后返回。
  • 递归逻辑:左右中
  1. 迭代法
  • 层序遍历:得到每一层的节点数,然后累加
  • 数据结构:队列

代码

递归法:

class Solution {
public:int countNodes(TreeNode* root) {if (root == nullptr) return 0;TreeNode* left = root->left;TreeNode* right = root->right;int leftDepth = 0, rightDepth = 0;//判断以当前节点为根节点的二叉树是否为满二叉树//得到左子树深度while (left) {left = left->left;leftDepth++;}//得到右子树深度while (right) {right = right->right;rightDepth++;}if (rightDepth == leftDepth) {return (2 << leftDepth) - 1;//(2 << 1) 相当于2^2,因此leftDepth初始化为0;返回当前满二叉树的节点}//递归逻辑return countNodes(root->left) + countNodes(root->right) + 1;//左 右 中}
};

迭代法

class Solution {
public:int countNodes(TreeNode* root) {if (root == nullptr) return 0;queue<TreeNode*> que;que.push(root);int sum = 0;while (!que.empty()) {int size = que.size();int num = 0;for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left);if (node->right) que.push(node->right);num++;}sum += num;}return sum;}
};

110、平衡二叉树

题目描述

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

思路

  1. 题目分析
  • 判断二叉树是否为平衡二叉树:需要求以当前节点为根节点的树的左右子树的高度,然后比较它们之间的差是否大于1。
  1. 递归法
  • 参数:传入当前节点
  • 返回值:int,如果以当前节点为根节点的二叉树是平衡二叉树,则返回当前二叉树的最大高度;如果不是平衡二叉树,返回-1。
  • 终止条件:当前节点为空时,返回0;
  • 递归逻辑:后序遍历,左右中
  1. 迭代法
  • 定义一个函数:求传入节点的高度
  • 用栈模拟后序遍历:每个节点的高度就是以这个节点为根节点的树的最大深度
  • 用栈模拟后序遍历:遍历每一个节点,求出每一个节点左右子树的高度,若高度大于1则返回false;否则,返回true。

代码

递归法

class Solution {
public:int getHeight(TreeNode* cur) {if (cur == nullptr) return 0;int leftHeight = getHeight(cur->left);//左子树高度if (leftHeight == -1) return -1;int rightHeight = getHeight(cur->right);//右子树高度if (rightHeight == -1) return -1;//子树最大高度加1 == 当前树的最大高度return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight);}bool isBalanced(TreeNode* root) {return getHeight(root) == -1 ? false : true;}
};

迭代法

class Solution {
public://节点的高度就是以节点为根节点的二叉树的最大深度int getDepth(TreeNode* cur) {stack<TreeNode*> st;if (cur != nullptr) st.push(cur);int depth = 0;//记录深度int res = 0;//用来返回的最大深度,也就是高度while (!st.empty()) {TreeNode* node = st.top();if (node != nullptr) {st.pop();st.push(node);st.push(nullptr);//标记depth++;if (node->right) st.push(node->right);//右if (node->left) st.push(node->left);//左 } else {st.pop();//去掉标记//node = st.top();//取出节点st.pop();depth--;}res = res > depth ? res : depth;}return res;}bool isBalanced(TreeNode* root) {stack<TreeNode*> st;if (root == nullptr) return true;st.push(root);while (!st.empty()) {TreeNode* node = st.top();st.pop();if (abs(getDepth(node->left) - getDepth(node->right)) > 1) return false;if (node->right) st.push(node->right);//右if (node->left) st.push(node->left);//左}return true;}
};

257、二叉树的所有路径

题目描述

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

思路

** 递归法**:

  • 返回值:不需要返回值
  • 参数:cur代表当前节点,vector<int>类型的path用来存储路径上的节点,vector<string>类型的res用来当作路径结果返回。
  • 终止条件:遇到叶子节点。也就是cur->left == null && cur->right == null
  • 递归逻辑:前序遍历,中左右
  • 回溯逻辑:每一次递归返回后都是一次回溯,应该把回溯前(递归返回前)遍历到的节点取出

迭代法

  • 用前序遍历的方式来模拟遍历路径的过程。
  • 数据结构:一个栈用来存储遍历到的节点;一个栈用来存储同步遍历过程的路径(当遇到叶子节点时栈顶元素为一条最终可用的路径);一个vector<string>类型的容器来存储最终的路径结果集
  • 随着遍历过程,一个栈存储遍历的节点,一个栈同步存储一条路径。
  • 到达叶子节点的时候,栈中存储的路径已经是最终可用的一条路径,将这条路径加入结果集。
  • 遍历过程中回退时,存储节点的栈和存储路径的栈要同时取出栈顶元素,达到回退效果。

代码

递归法

class Solution {
public:void traversal(TreeNode* cur, vector<int>& path, vector<string>& res) {path.push_back(cur->val);//中//终止条件:遇到叶子节点if (cur->left == nullptr && cur->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]);res.push_back(sPath);return;}//左if (cur->left) {traversal(cur->left, path, res);path.pop_back();//回溯}//右if (cur->right) {traversal(cur->right, path, res);path.pop_back();//回溯}}vector<string> binaryTreePaths(TreeNode* root) {vector<int> path;vector<string> res;if (root == nullptr) return res;traversal(root, path, res);return res;}
};

迭代法

class Solution {
public:vector<string> binaryTreePaths(TreeNode* root) {stack<TreeNode*> treeSt;//用来保存遍历的节点stack<string> pathSt;//用来保存一条路径,栈顶的元素是最终路径(根节点到当前节点的路径)vector<string> result;//用来保存路径集if (root == nullptr) return result;treeSt.push(root);pathSt.push(to_string(root->val));while (!treeSt.empty()) {TreeNode* node = treeSt.top(); treeSt.pop();//取出节点   中string path = pathSt.top(); pathSt.pop();//取出该节点对应的路径//当前节点叶子节点,当前路径也是一条可用的路径if (node->left == nullptr && node->right == nullptr) {result.push_back(path);}//右if (node->right) {treeSt.push(node->right);pathSt.push(path + "->" + to_string(node->right->val));}//左if (node->left) {treeSt.push(node->left);pathSt.push(path + "->" + to_string(node->left->val));}}return result;}
};

总结

  1. 节点的高度:从最下层节点到该节点的节点个数。
  2. 节点的深度:从根节点到该节点的节点个数。
  3. 求深度要从上往下查,用前序遍历(中左右)。
  4. 求高度要从下往上查,用后序遍历(左右中)。

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

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

相关文章

在windows下使用本地AI模型提供翻译、对话、文生图服务

文章目录 在windows下使用本地AI模型提供翻译、对话、文生图服务ollama简介下载安装配置环境变量模型安装目录服务监听地址跨域配置我的配置注意事项 开机自启 使用运行模型对话时的命令 查看本地已安装模型删除模型 查看ollama支持的模型 Docker Desktop简介下载安装配置开机自…

【C++】浅拷贝与深拷贝

在C中&#xff0c;浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;是两种不同的对象拷贝方式。它们之间的主要区别在于对指针成员的处理方式&#xff1a; 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝在C中通常是指默认的拷贝构…

STM32智能小车学习笔记(避障、循迹、跟随)

我们使用的是STM32CubeMX软件和MDK5 芯片使用的是STM32F103C8T6 完成对STM32CubeMX的初始化后开始我们的第一步点亮一个LED灯 一、点亮LED灯 点亮PC13连接的灯 打开STM32CubeMX软件&#xff0c;pc13设置为输出模式 然后按照这样配置&#xff0c;user label 设置成这个IO口代…

FJSP:烟花算法(FWA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、烟花算法介绍 参考文献&#xff1a; Tan, Y. and Y. Zhu. Fireworks Algorithm for Optimization. in Advances in Swarm Intelligence. 2010. Berlin, Heidelberg: Springer Berlin Heidelberg. 二、烟花算法求解FJSP 2.1FJSP模型介绍 柔性作业车间调度问题(Flexible …

git 怎么让一个文件不提交

要让一个文件不被提交到Git仓库中&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;忽略文件 1. 在项目根目录下创建一个名为 “.gitignore” 的文件。 2. 打开该文件&#xff0c;在每一行写入一个要忽略的文件或文件夹的路径&#xff0c;可以使用通配符匹配多…

Spring-core-MethodParameter

MethodParameter这个类用于方法参数的抽象&#xff0c;例如下面这个方法&#xff0c;我们就可以说test方法包含了3个MethodParameter实例&#xff0c;一个是入参aa&#xff0c;一个是入参bb&#xff0c;还有一个是String类型的返回值 public class AController {public String…

ubuntu 用户名及密码忘记操作

1、重启系统&#xff0c;长按Shift键&#xff0c;直到出现菜单&#xff0c;选则高级设置。选择recovery mode&#xff0c;即恢复模式 2、选择root 3、# 后面敲入 sudo passwd 用户名 4、# passwd "用户名" 之后再敲两次密码就可以了。(如果提示修改失败可先执行&a…

在C++中用3种方法访问一个字符串

1&#xff0e;用字符数组存放一个字符串 编写程序&#xff1a; str是字符数组名&#xff0c;它代表字符数组的首元素的地址&#xff0c;输出时从str指向的字符开始&#xff0c;逐个输出字符&#xff0c;直至遇到\0为止。 2&#xff0e;用字符串变量存放字符串 编写程序&…

PaddleSpeech MFA:阿米娅中文音色复刻计划

PaddleSpeech&#xff1a;阿米娅中文音色复刻计划 本篇项目是对iterhui大佬项目[PaddleSpeech 原神] 音色克隆之胡桃的复刻&#xff0c;使用的PaddleSpeech的版本较新&#xff0c;也针对新版本的PaddleSpeech做了许多配置之上的更新并加入了自己对语音的对齐、配置、训练其它任…

Linux-常用命令-常用设置

1.帮助类命令 1.man命令-获得帮助信息 man [命令或配置文件]例&#xff1a;查看ls命令的帮助信息 man ls输入 ZZ 退出帮助2.服务管理类命令 1.centos7语法 1.1 临时开关服务命令 开启服务&#xff1a; systemctl start 服务名 关闭服务&#xff1a; systemctl stop 服务…

langchian_aws模块学习

利用langchain_aws模块实现集成bedrock调用模型&#xff0c;测试源码 from langchain_aws.chat_models import ChatBedrock import jsondef invoke_with_text(model_id, message):llm ChatBedrock(model_idmodel_id, region_name"us-east-1")res llm.invoke(messa…

STM32 printf 重定向到CAN

最近在调试一款电机驱动板 使用的是CAN总线而且板子上只有一个CAN 想移植Easylogger到上面试试easylogger的效果&#xff0c;先实现pritnf的重定向功能来打印输出 只需要添加以下代码即可实现 代码 #include <stdarg.h> uint8_t FDCAN_UserTxBuffer[512]; void FDCAN_p…

vue-router 源码分析——4.嵌套路由

这是对vue-router 3 版本的源码分析。 本次分析会按以下方法进行&#xff1a; 按官网的使用文档顺序&#xff0c;围绕着某一功能点进行分析。这样不仅能学习优秀的项目源码&#xff0c;更能加深对项目的某个功能是如何实现的理解。这个对自己的技能提升&#xff0c;甚至面试时…

小程序 UI 风格魅力非凡

小程序 UI 风格魅力非凡

[创业之路-114] :互联网时代下的扁平化管理趋势与面临的挑战

目录 前言&#xff1a;扁平化管理的时代背景 一、扁平化管理的定义 二、扁平化管理的特点 三、扁平化管理的实施 四、扁平化管理的优势 五、偏平化管理的缺点 六、扁平化管理面临的挑战 七、扁平化管理条件和配套措施 7.1 扁平化管理的条件 7.2 扁平化管理的配套措施…

React Native采集数据离线存储、网络状态监控、加密上传、鉴权

在无网络环境下进行数据采集并在有网络时上传至服务器&#xff0c;同时确保数据的鉴权和加密&#xff0c;这一需求需要考虑多方面的实现细节。无论您选择原生开发还是使用React Native&#xff08;甚至Expo&#xff09;&#xff0c;以下是如何实现这一需求的具体步骤和建议。 …

【Vue】面经基础版-动态路由传参

实现步骤 改造路由动态传参在详情页获取参数 代码实现 改造路由 router/index.js ... {path: /detail/:id,component: ArticleDetail }\views\Article.vue <div class"article-item" v-for"item in articelList" :key"item.id" click&qu…

元音 (音标) 和元音字母的区别

元音 [音标] 和元音字母的区别 1. 音位 (phoneme)1.1. Correspondence between letters and phonemes 2. 元音 (vowel)3. 辅音 (consonant)3.1. Consonant sounds and consonant letters 4. 元音字母 (vowel letter)References 1. 音位 (phoneme) https://en.wikipedia.org/wi…

五分钟上手IoT小程序

五分钟上手IoT小程序 IoT小程序框架搭建开发环境首先安装NodeJs安装NodeJs验证安装成功 安装cnpm 安装VSCode 开发IDE下载开发IDE安装开发IDE安装框架脚手架 下载模拟器创建工程项目应用编译(打包构建) VSCode 开发IDE安装插件通过开发插件创建工程编译工程debug编译编译太慢问…

13、SpringBoot 源码分析 - 自动配置深度分析六

SpringBoot 源码分析 - 自动配置深度分析六 refresh和自动配置大致流程AutoConfigurationImportSelector的fireAutoConfigurationImportEvents通知自动配置导入事件AutoConfigurationGroup的selectImports封装成Entry返回MyAutoConfiguration自动配置类创建META-INF文件夹和文件…