【算法练习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.hqwc.cn/news/129683.html

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

相关文章

Redis三种模式(主从复制,哨兵,集群)

Redis三种模式&#xff08;主从复制&#xff0c;哨兵&#xff0c;集群&#xff09; 一、主从复制1.1、主从复制概述1.2、 Redis主从复制流程1.3、 Redis主从复制作用1.4 、部署Redis 主从复制 二、Redis 哨兵模式2.1、哨兵模式的原理2.2、哨兵模式的作用2.3、哨兵的结构组成2.4…

力扣 -- 132. 分割回文串 II

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int minCut(string s) {int ns.size();//保存s的所有子串是否是回文串的信息的哈希表vector<vector<bool>> hash(n,vector<bool>(n));for(int in-1;i>0;i--){for(int ji;j<n;j){i…

6-10 单链表分段逆转 分数 15

void K_Reverse( List L, int K ) { //此题已经默认size > K 因为当size < K时 反转后将不再符合链表的定义//求出表中元素个数int size 0;for (List cur L->Next; cur ! NULL; cur cur->Next)size; List prv, cur, next, first, head L;//共需要反转 si…

设计模式 - 行为型模式考点篇:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、策略模式 1.1.1、概论 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、策略模式 1.1.1、概论 策略模式设计的每一个算法都封装了起来&#xff0c;使他们可以相互替换&#xff0c;通过一个对象委派不同的算法给相应的客户…

Hive【Hive(六)窗口函数】

窗口函数&#xff08;window functions&#xff09; 概述 定义 窗口函数能够为每行数据划分 一个窗口&#xff0c;然后对窗口范围内的数据进行计算&#xff0c;最后将计算结果返回给该行数据。 语法 窗口函数的语法主要包括 窗口 和 函数 两个部分。其中窗口用于定义计算范围…

Spark基础

一、spark基础 1、为什么使用Spark Ⅰ、MapReduce编程模型的局限性 (1) 繁杂 只有Map和Reduce两个操作&#xff0c;复杂的逻辑需要大量的样板代码 (2) 处理效率低 Map中间结果写磁盘&#xff0c;Reduce写HDFS&#xff0c;多个Map通过HDFS交换数据 任务调度与启动开销大 (…

【C/C++】指针函数与函数指针

1、指针函数--指针作为函数的返回值 指针函数本质是一个函数&#xff0c;只不过函数的返回值是一个指针 #include <stdio.h> #include <malloc.h> #include <string.h>char * funGetString(); int main() {char * sentence funGetString();printf(" %…

Java练习题-用冒泡排序法实现数组排序

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…

域信息收集

DMZ&#xff0c;是英文“demilitarized zone”的缩写&#xff0c;中文名称为“隔离区”&#xff0c;也称“非军事化区”。它是为了解决安装防火墙后外部网络的访问用户不能访问内部网络服务器的问题&#xff0c;而设立的一个非安全系统与安全系统之间的缓冲区。该缓冲区位于企业…

Lua系列文章(1)---Lua5.4参考手册学习总结

windows系统上安装lua,下载地址&#xff1a; Github 下载地址&#xff1a;https://github.com/rjpcomputing/luaforwindows/releases 可以有一个叫SciTE的IDE环境执行lua程序 1 – 简介 Lua 是一种强大、高效、轻量级、可嵌入的脚本语言。 它支持过程编程&#xff0c; 面向对…

android Google官网 :支持不同的语言和文化 rtl / ltr : 本地化适配:RTL(right-to-left) 适配

参考 google官网&#xff1a; 支持不同的语言和文化 应用包含可能专门针对特定文化而设计的资源。例如&#xff0c;应用可以包含针对特定文化的字符串&#xff0c;这些字符串将转换为当前语言区域的语言。 将具有文化特异性的资源与应用的其他资源分开是一种很好的做法。And…

vue,mixins混入

痛点&#xff1a;当我们的项目越来越庞大&#xff0c;项目中的某些组件之间可能会存在一些相似的功能&#xff0c;这就导致了在各个组件中需要编写功能相同的代码段&#xff0c;重复地定义这些相同的属性和方法&#xff0c;导致代码地冗余&#xff0c;还不利于后期代码的维护。…