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

110. 平衡二叉树

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

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

int traversal(TreeNode* root){if(root==nullptr) return 0;//递归左孩子和右孩子int leftdepth = traversal(root->left);int rightdepth = traversal(root->right);//如果左右孩子有-1,直接返回-1if (leftdepth==-1) return -1;if(rightdepth==-1) return -1;int result = abs(leftdepth-rightdepth) > 1? -1:max(leftdepth, rightdepth)+1;//判断左右孩子是否为-1return 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){//中,提前放入strstr.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.rhkb.cn/news/410256.html

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

相关文章

量化需求的业务价值 常见6种方法

量化需求的业务价值可以帮助项目团队更好地理解需求的重要性&#xff0c;并据此做出明智的决策。如果没有明确的量化目标&#xff0c;团队难以做出基于数据的决策&#xff0c;可能导致项目方向模糊&#xff0c;资源分配不当&#xff0c;导致项目进度难以把控&#xff0c;延误交…

平安银行“平安财富杯”高尔夫青少年冠军赛盛大举行,各组冠军精彩角逐实力尽显

今年夏天&#xff0c;巴黎体育盛会聚集了全球目光&#xff0c;中国选手林希妤斩获女子高尔夫球铜牌&#xff0c;追平中国女子高尔夫球历史最佳奥运战绩&#xff0c;让球迷大呼过瘾。奥运会结束后&#xff0c;比赛的热情在中原大地继续上演。8月22日&#xff0c;2024年平安银行“…

Shopify/shopline等独立站paypal快速提现到国内银行卡

做shopify/shopline/shopyy/shoplazza独立站用得最多的收款方式为paypal。 下面介绍如何把paypal里面的资金提现到我们国内银行卡&#xff0c;收款工具是GeeWallet。 1、注册GeeWallet注册入口 2、打开链接&#xff0c;填入手机号或者邮箱&#xff0c;点击立即注册 3、在注册…

【软件使用-MEGA】报错及解决方法

报错1&#xff1a;Error: MEGA has detected duplicate taxa labels. (in line 370) **************************************************************************** ; Please note the following important messages: ; **********************************…

学习之数据库相关概念

数据库相关概念 主流的关系型数据库管理系统&#xff1a;

如何使用ssm实现基于jsp的快递管理系统的开发

TOC ssm226基于jsp的快递管理系统的开发jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规…

力扣刷题(复习版)

文章目录 题目&#xff1a;最大重复子字符串题解 题目&#xff1a; 面试题 16.07. 最大数值题解 题目&#xff1a; 最大字符串配对数目题解 题目&#xff1a; 字符串中第二大的数字题解 题目&#xff1a; 统计最大组的数目题解 题目&#xff1a; 删除每行中的最大值题解 总结 题…

Commons Lang库中,StringUtils.isBlank()和StringUtils.isEmpty()区别

在Apache Commons Lang库中&#xff0c;StringUtils.isBlank()和StringUtils.isEmpty()方法都是用来判断字符串是否为空或者空白的。它们的主要区别在于处理空格的方式上。 StringUtils.isEmpty(String str): 这个方法会返回true当字符串为null或者长度为0时。也就是说&#xf…

酸敏感多肽在药物递送方面的作用机制及其应用

摘要: 作为一类新型的递送载体&#xff0c;多肽具有丰富的生物活性、较低的免疫原性及良好的生物相容性&#xff0c;近年来利用多肽递送药物或基因的研究得到广泛关注。其中&#xff0c;具有酸敏感性的多肽&#xff0c;在肿瘤微环境或溶酶体的弱酸性条件下可以产生二级结构的改…

【bug】可图文生图模型 KolorsPipeline IndexError: list index out of range

【bug】可图文生图模型 KolorsPipeline IndexError: list index out of range 环境 linux diffusers 0.30.0问题详情 报错详情 from diffusers import KolorsPipelineTraceback (most recent call last):File "Kolors/demo.py", line 6, in <module>pi…

Circuitjs 利用标签(label)简化电路连线

在使用 circuitjs 绘制电路的过程中, 一旦电路变得复杂, 连线众多, 然后各种交叉就不可避免, 给人一种凌乱的感觉, 而某些跨越长距离的连线连接起来也特别麻烦, 后续如果要调整也特别繁琐. 为解决这些问题, 需要引入一种 虚拟连接 的方式, 简单讲就是在要连接的两头用同样的名…

Web-ssrfme

文章目录 环境分析攻击 环境 首先下载资源包&#xff0c;Ubuntu通过docker拉取环境。 docker-compose up -d分析 <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);e…

Zombie Slayer(僵尸枪手第三人称射击模板)

特征: -3个独特的玩家。 -4个独特的僵尸。 -三种类型的武器。手枪、突击步枪和手榴弹。 -2个独特的地点。墓地。 -武器升级系统。 易于添加新武器、等级、敌人。 下载:​​Unity资源商店链接资源下载链接 效果图:

网络优化2|最小生成树|Kruskal|Prim|Matlab

最小生成树问题 树 连通图 G ( V , E ) G(V,E) G(V,E)&#xff0c;若G中不含任何回路&#xff0c;则称G为树。 ∣ V ∣ 1 |V |1 ∣V∣1时称之为平凡树 生成树 G ( V , E ) G(V,E) G(V,E)&#xff0c;若G的一个生成子图是一棵树&#xff0c;则称之为G的一棵生成树&#…

Vue3+Ts封装input组件时遇到的问题

使用input事件监听输入框变化时&#xff0c;如果当前使用的输入法是中文&#xff0c;他也会触发input事件&#xff0c;正常来说&#xff0c;中文没有输入完毕是不用触发事件的。 控制台打印时发现&#xff1a; 那么我们应该怎么去规避这件事呢&#xff1f; 其实input还有几个事…

echarts地图-单独给香港和澳门画引导线

因为香港特别行政区和澳门特别行政区的名字特别长又需要显示全名 所以显示在地图上会挤在一起&#xff0c;所以根据天地图的坐标来加了两个引导线&#xff08;echarts5以下&#xff01;&#xff01;&#xff01;&#xff09; var fullName {北京: 北京市,天津: 天津市,河北: …

利用深度学习技术来实现街景图像的语义分割(街景图像语义分割)

本项目致力于利用深度学习技术来实现街景图像的语义分割。通过精确地识别和分类图像中的每个像素&#xff0c;该技术能够自动划分出街道、人行道、车辆、行人等各种不同的物体类别。这在智能交通系统、自动驾驶、城市规划等领域有着广泛的应用前景。 技术实现 深度学习模型&am…

从永远到永远-日语学习-て形用法及变形规律

て形用法及变形规律 0.前置知识1.常见用法1.请求某人做某事 「&#xff5e;てください」2.几个连续发生的动作 &#xff5e;て、&#xff5e;て、&#xff5e;て3.两个动作先后发生「てから」4. 表示许可 「てもいいです」5.表示禁止 「&#xff5e;てはいけません」6.「&#…

IPv4和IPv6的区别是什么?什么是局域网和广域网,公网IP和私有IP?

文章目录 1.基本网络2.局域网3.广域网4.IPv4与NAT5.公网IP和私有IP6.IPv6 1.基本网络 我们都知道计算机的数据都是存在各自硬盘中的,与其他计算机之间没有人任务关系. 假设计算机A需要给计算机B发送数据,可以选择使用U盘这类移动存储数据来拷贝数据来实现数据交互,但是这样一…

Docker 部署 Kafka 可视化 Kafka-UI

前言 本文部署的Kafka-UI 是基于Docker Compose 部署 Kafka的KRaft模式&#xff0c;如有需要可访问下文链接 Docker Compose 部署 Kafka的KRaft模式 不用依赖 Zookeeper 此部署也适用于不是docker部署的kafka集群 1.启动 Kafka-UI 服务 1.1 kafka 来自docker安装 docker r…