【算法练习Day15】平衡二叉树二叉树的所有路径左叶子之和

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 平衡二叉树
  • 二叉树的所有路径
  • 左叶子之和
  • 总结:

平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode)
在这里插入图片描述

什么是平衡二叉树呢?
该树的每一个节点的两棵子树高度差的绝对值不高于1,则说明该二叉树是平衡二叉树。

思路是这样的:我们可以写一个函数,它的作用是帮我们算出两子树最高的那一个是多高,直到返回到根节点,在比较各个子树的高矮时,如果碰到两子树相差过高,则直接返回-1,在下面比较时我们直接能判断出来。函数的书写我们使用后序遍历的思路,因为我们要判断一个节点的子树,相差是否大于1,然后向上返回,只有后序遍历才能先遍历到两子树。

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;}return abs(leftHeight-rightHeight)>1?-1:1+max(leftHeight,rightHeight);}bool isBalanced(TreeNode* root) {return getHeight(root)==-1?false:true;}
};

递归的思路就是遍历到空节点就是左右子树为0,所以返回0,然后创建两个整形来保存数据,进入递归分别保存左右子树的高度,然后在最后处理中间节点时作比较,如果高度大于1返回-1,到上一层if判断如果为-1,直接返回-1跳出,如果不是继续遍历,接着将结果赋给整型变量存储。我们是使用判断子树高度的思想来间接判断各子树是否能够平衡。

二叉树的所有路径

257. 二叉树的所有路径 - 力扣(LeetCode)
在这里插入图片描述

这道题就是遍历二叉树的所有节点然后将他们用->连接起来,每一条不同的路径使用不同的字符串,而不是所有路径都是一个字符串。

class Solution {
public:
void get(TreeNode*root,vector<int>& path,vector<string>&result){path.push_back(root->val);if(root->left==NULL&&root->right==NULL){string path2;for(int i=0;i<path.size()-1;i++){path2+=to_string(path[i]);path2+="->";}path2+=to_string(path[path.size()-1]);result.push_back(path2);}if(root->left){get(root->left,path,result);path.pop_back();}if(root->right){get(root->right,path,result);path.pop_back();}
}vector<string> binaryTreePaths(TreeNode* root) {vector<string>result;vector<int>path;get(root,path,result);return result;}
};

这里我们采用前序遍历来写函数的具体实现,要将加入节点写到最前面,因为我们的递归终止条件是遇到叶子节点时,跳出递归返回。需要注意的是每次写完递归之后,还要再下面写下pop,原因是在进入下一个不同路径之前,我们需要pop函数帮助我们弹出这条路径的节点,才能让数组加入下一条路径的数据,而将该数组转化为字符串形式和添加->等这些操作都在,递归的终止条件下进行。

代码精简后:

class Solution {
public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> ret;string path;if(root==nullptr){return ret;}dfs(root,path);return ret;}void dfs(TreeNode* root,string path){path+=to_string(root->val);// 中if(root->left==nullptr&&root->right==nullptr){ret.push_back(path);return;}path+="->";//回溯if(root->left)dfs(root->left,path);// 左if(root->right)dfs(root->right,path); // 右}
};

左叶子之和

404. 左叶子之和 - 力扣(LeetCode)
在这里插入图片描述

这道题是求出该树中左叶子的节点值和,左叶子是左子树和右子树的全部左子叶。解题思路是:写一个函数,分别遍历各节点的左子叶是不是叶子节点,如果是则加入进总数中,最后返回总数。这里我们判断的是左子叶的上一个节点,而不是等到判断到左子叶节点在做处理,这里我们仍然使用后序遍历的方法,将各节点左子叶的总数依次返回直到根节点为止。

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if (root == NULL) return 0;if (root->left == NULL && root->right== NULL) return 0;int leftValue = sumOfLeftLeaves(root->left);    // 左if (root->left && !root->left->left && !root->left->right) { // 左子树就是一个左叶子的情况leftValue = root->left->val;}int rightValue = sumOfLeftLeaves(root->right);  // 右int sum = leftValue + rightValue;               // 中return sum;}
};

我们在遍历右侧子树时,也就是后序遍历中的右半部分,只管递归而不做判断的处理,因为要算得是左叶子节点的值,当它一直递归下去往上返回后还是交给左边递归来进行节点的判断。

总结:

今天我们完成了平衡二叉树、二叉树的所有路径、左叶子之和三道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

周总结【java项目】

项目进度&#xff1a; 学习了JavaFX&#xff0c;下载了sceneBuilder辅助工具构建窗口&#xff08;目前建立了登陆&#xff0c;注册&#xff0c;忘记密码的界面&#xff09;&#xff0c;然后是学习了MySQL的连接&#xff0c;现在的项目是刚连上数据库&#xff1b; 下一步&…

多线程锁-synchronized字节码分析

从字节码角度分析synchronized实现 javap -c(v附加信息) ***.class 文件反编译 synchronized同步代码块 >>>实现使用的是monitorenter和monitorexit指令 synchronized普通同步方法 >>>调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置&#xf…

【项目】5.1阻塞和非阻塞、同步和异步 5.2Unix、Linux上的五种IO模型

5.1阻塞和非阻塞、同步和异步&#xff08;网络IO&#xff09; 典型的一次IO的两个阶段是什么&#xff1f;数据就绪和数据读写 数据就绪&#xff1a;根据IO操作的就绪状态 阻塞非阻塞 数据读写&#xff1a;根据应用程序和内核的交互方式 同步异步 陈硕&#xff1a;在处理IO的…

华为云API自然语言处理的魅力—AI情感分析、文本分析

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI自言语言的情感分析、文本分词、文本翻译 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&a…

Mac os 点击桌面 出现黑边框 解决

1、桌面黑框效果 2、解决&#xff1a;设置为 仅在台前调度中

img标签src动态绑定资源失败问题

img标签src动态绑定资源失败问题 需要采用require的方式进行 在 Vue 中&#xff0c;require 是一个通用的模块加载函数&#xff0c;用于在运行时&#xff08;客户端或服务器端&#xff09;引入模块。它通常用于加载 JavaScript 文件、JSON 数据、静态资源等。 组件使用&#xf…

6.01 定时任务,关闭超时订单

步骤1&#xff1a;创建定时任务类 import com.imooc.service.OrderService; import com.imooc.utils.DateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.s…

mysql在Ubuntu中新增用户配置

打开终端&#xff08;Terminal&#xff09;。 使用超级用户权限登录到 MySQL 服务器。如果您知道MySQL的root用户密码&#xff0c;可以运行以下命令并输入密码&#xff1a; sudo mysql -u root -p 如果您没有设置MySQL root密码&#xff0c;可以直接使用以下命令登录&#xff…

读书笔记--未来简史关键金句和阅读感悟

借着国庆假期&#xff0c;终于有时间研读了尤瓦尔.赫拉利的《未来简史》&#xff0c;作者的写作方式、文笔、观察视角都是我喜欢的类型&#xff0c;作者从古到今&#xff0c;谈到了上帝、神、宗教、科技、生物、智人到未来的超人智神&#xff08;数据主义&#xff09;&#xff…

Elasticsearch:时间点 API

Elasticsearch&#xff1a;时间点 API-CSDN博客 在今天的文章中&#xff0c;我将着重介绍 Point in time API。在接下来的文章中&#xff0c;我将介绍如何运用 PIT 来对搜索结果进行分页。这也是被推荐使用的方法。 Point in time API 默认情况下&#xff0c;搜索请求针对目标…

水波纹文字效果动画

效果展示 CSS 知识点 text-shadow 属性绘制立体文字clip-path 属性来绘制水波纹 工具网站 CSS clip-path maker 效果编辑器 页面整体结构实现 使用多个 H2 标签来实现水波纹的效果实现&#xff0c;然后使用clip-path结合动画属性一起来进行波浪的起伏动画实现。 <div …

Android 使用 registerForActivityResult() 打开系统相册或相机获取图像

一、简介 当使用了 AndroidX 后&#xff0c;发现 startActivityForResult() 标记为过时了&#xff0c;而是推荐我们使用 registerForActivityResult() 函数。 registerForActivityResult() 函数是 Android 中用于启动 Activity 结果回调的新方式。这个函数的目的是简化在 Act…

CSS基础语法之盒子模型

目录 一、 选择器 1.1 结构伪类选择器 1.1.1基本使用 1.1.2 :nth-child(公式) 1.2 伪元素选择器 二、 PxCook 三、盒子模型 3.1 盒子模型-组成 3.2 边框线 3.2.1四个方向 3.2.2 单方向边框线 3.3 内边距 3.4 尺寸计算 3.5 外边距+版心居中 3.6 清除默认样式 3.7…

11.3 读图举例

一、低频功率放大电路 图11.3.1所示为实用低频功率放大电路&#xff0c;最大输出功率为 7 W 7\,\textrm W 7W。其中 A \textrm A A 的型号为 LF356N&#xff0c; T 1 T_1 T1​ 和 T 3 T_3 T3​ 的型号为 2SC1815&#xff0c; T 4 T_4 T4​ 的型号为 2SD525&#xff0c; T 2…

【从0开始配置前后端项目】——Docker环境配置

1. 准备一台纯净的服务器 镜像&#xff1a;CentOS 7.9 64位 CPU & 内存&#xff1a;2核2G 系统盘&#xff1a;60GB 峰值带宽&#xff1a;30Mbps 流量包&#xff1a;600GB / 600GB 2. 安装Docker 2.1 卸载旧的版本 $ sudo yum remove docker \docker-client \docker-cl…

前端笔试题总结,带答案和解析(一)

1. 执行以下程序&#xff0c;输出结果为&#xff08;&#xff09; var x 10; var y 20; var z x < y ? x:y; console.log(xx;yy;zz);A x11;y21;z11 B x11;y20;z10 C x11;y21;z10 D x11;y20;z11 初始化x的值为10&#xff0c;y的值为20&#xff0c;x < y返回结果为tru…

【ONE·Linux || 多线程(二)】

总言 多线程&#xff1a;生产者消费者模型与两种实现方式&#xff08;条件变量、信号量&#xff09;、线程池。 文章目录 总言4、生产者消费者模型4.1、基本概念4.2、基于BlockingQueue的生产者消费者模型&#xff08;理解条件变量&#xff09;4.2.1、单生产者单消费者模式&am…

【juc】countdownlatch实现游戏进度

目录 一、截图示例二、代码示例 一、截图示例 二、代码示例 package com.learning.countdownlatch;import java.util.Arrays; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurr…

爱普生LQ1900KIIH复位方法

爱普生EPSON 1900KIIH是一部通用针式打印机&#xff0c;136列&#xff08;10cpi下&#xff09;的打印宽度&#xff0c;缓冲区128KB&#xff0c;打印速度为270字/秒。 打印机类型 打印方式&#xff1a;24针击打式点阵打印、打印方向&#xff1a;双向逻辑查找、安全规格标准&am…

Dubbo-CVE-2020-1948

APache Dubbo简介 Dubbo是一个分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;以及SOA服务治理方案。简单的说&#xff0c;dubbo就是个服务框架&#xff0c;如果没有分布式的需求&#xff0c;其实是不需要用的&#xff0c;只有在分布式…