代码随想录Day 17 | 110 平衡二叉树 257 二叉树的所有路径 404 左叶子之和

代码随想录Day 17 | 110 平衡二叉树 257 二叉树的所有路径 404 左叶子之和

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

平衡二叉树

文档讲解:代码随想录
视频讲解: 后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树
状态

左右子树的高度差不大于1,高度就采用后序遍历,同样使用递归的解法

  1. 终止条件:当前节点为空时 就返回0
  2. 函数参数:树的所有节点,返回值树的高度或者失效标记
  3. 单层递归功能函数:在一个父节点的位置我们需要做一件事,一个是判断当前父节点的左右子树是不是高度差小于等于1,如果是那么就可以返回当前这个节点的高度给它的父节点。如果不是说明已经不是AVL树了,这时候就需要一个标记来说明,然后返回这个标记给其父节点。当父节点接受到这个标记就知道已经不是AVL,那么后面的求父节点的高度也不需要做了,直接继续返回标记
class Solution {public:int IsAVL(TreeNode* root){//终止条件if(root == nullptr) return 0;//后序遍历//左节点int left = IsAVL(root->left);//如果得到-1的返回说明其子树中已经不满足,则直接返回-1if(left == -1) return -1;//右节点int right = IsAVL(root->right);if(right == -1) return -1;//单层递归//判断左右子树的高度差if(abs(left-right) > 1){return -1;}return 1+max(left,right);}
public:bool isBalanced(TreeNode* root) {int res = IsAVL(root);if(res == -1) return false;return true;}
};

利用层序遍历的迭代法:对每个节点进行层序遍历那么求得的就是以该节点为根节点的子树深度,同样也是高度。所以我们可以先定义一个求取深度的函数,然后同样利用层序遍历,对每个节点的左右子节点调用这个函数,然后来比较深度差值。

class Solution {public:int GetDep(TreeNode* cur){queue<TreeNode*> treeque;if(cur) treeque.push(cur);int dep = 0;while(!treeque.empty()){int tempsize = treeque.size();for(int i = 0;i<tempsize;i++){TreeNode* temp = treeque.front();treeque.pop();if(temp->left) treeque.push(temp->left);if(temp->right) treeque.push(temp->right);}dep++;}return dep;}
public:bool isBalanced(TreeNode* root) {queue<TreeNode*> treeque;if(root) treeque.push(root);while(!treeque .empty()){int tempsize = treeque.size();for(int i=0;i<tempsize;i++){TreeNode* cur = treeque.front();int left = GetDep(cur->left);int right = GetDep(cur->right);if(abs(left-right) > 1){return false;}treeque.pop();if(cur->left) treeque.push(cur->left);if(cur->right) treeque.push(cur->right);}}return true;}
};

二叉树的所有路径

文档讲解:代码随想录
视频讲解: 递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径
状态:×

从根节点开始到一个叶子节点的路径,采用前序遍历,当寻找到一条路径,还需要回退到上一个岔路口,选择另一条路进行遍历找到其他的路径,直到所找到的出口是最右边的叶子节点。
递归的三个要素

  1. 参数和返回值:节点,当前的这条路径的所有节点组成的数组path,最终存储结果的数组res
  2. 循环终止条件:当当前节点的左节点和右节点为空时,说明该节点是叶子节点,就说明当前这条路径到头了。
    当到达终止条件时,就应该处理当前字符串的结果了,这时候我们就需要将path中的所有节点值变为字符存入res中
  3. 单层递归
    递归加回溯,递归和回溯不能分开,首先是对中节点的操作就是直接压入path数组中,对于左节点和右节点分别调用递归,如果存在的话。调用递归之后还需要回溯
if (cur->left) {traversal(cur->left, path, result);path.pop_back(); // 回溯
}
if (cur->right) {traversal(cur->right, path, result);path.pop_back(); // 回溯
}

具体代码

/*** 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:void GetPath(TreeNode* root, vector<int> path, vector<string>& res){//中节点操作,先操作中节点,是为了叶子节点成为中节点是的加入pathpath.push_back(root->val);if(root->left == nullptr && root->right == nullptr){string temp;for(int i=0;i<path.size()-1;i++){temp += to_string(path[i]);temp += "->";}temp += to_string(path[path.size()-1]);res.push_back(temp);return ;}//递归左右,回溯if(root->left){GetPath(root->left,path,res);//回溯到父节点 即岔路口//path.pop_back();}if(root->right){GetPath(root->right,path,res);//path.pop_back();}}
public:vector<string> binaryTreePaths(TreeNode* root) {vector<int> temp;vector<string> res;GetPath(root, temp, res);return res;}
};

回溯的目的主要要是保证当前节点的数组统计保持不变,这样在向回递归时,可以保持在节点处,所以如果对于传入函数的参数是值传入,那么其实就可以不需要使用回溯。因为对path的修改只是对临时变量的修改并不会改变函数外部的path,相当于用语法特性来完成了回溯。如果是按指针或者引用传递,那么就会对函数外部的path修改为了保持当前节点的path不变,需要手动回溯

左叶子之和

文档讲解:代码随想录
视频讲解: 二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和
状态:

递归三要素

  1. 返回值和参数,我采用了没有返回值,参数为节点和最终求和的值这两个参数
  2. 终止条件:当前节点为空,因为左或者右叶子节点的判断只能通过父节点来判断
  3. 单层递归逻辑:当前父节点(中)用来存储其子树的左叶子节点和,对于存在左右子节点那么就继续递归调用。
class Solution {void GetLeft(TreeNode* root, int& sum){if(root == nullptr) return ;//对左节点的递归if(root->left){GetLeft(root->left,sum); }//对右节点的递归if(root->right){GetLeft(root->right,sum);}//对中节点的计算if(root->left !=nullptr && root->left->left == nullptr && root->left->right == nullptr){sum += root->left->val;}}
public:int sumOfLeftLeaves(TreeNode* root) {int sum = 0;GetLeft(root,sum);return sum;}
};

采用的是左右中的顺序

采用层序遍历
对弹出的节点判断其是否有左叶子节点,如果是就加入

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {queue<TreeNode*> treeque;if(root) treeque.push(root);int sum = 0;while(!treeque.empty()){int tempsize = treeque.size();for(int i=0;i<tempsize;i++){TreeNode* cur = treeque.front();treeque.pop();if(cur->left != nullptr && cur->left->left == nullptr && cur->left->right == nullptr){sum += cur->left->val;}if(cur->left) treeque.push(cur->left);if(cur->right) treeque.push(cur->right);}}return sum;}
};

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

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

相关文章

DEJA_VU3D - Cesium功能集 之 117-雷达扫描(圆环效果)

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…

C++知识点总结(13):函数

一、定义 函数&#xff0c;指可以实现某个功能&#xff0c;可以重复使用的一段代码。不同的函数之间相互独立&#xff0c;即函数之间的功能互不影响&#xff08;互相的代码&#xff09;。 二、结构 1. 定义 返回值类型 函数名(形参1, 形参2, 形参3...形参n) {...return 值; }2…

Java初学习

Java代码示例&#xff1a; public class helloworld {public static void main(String[] args){System.out.println("hello world");} } Java程序的名字需要和文件名字一致&#xff0c;就是那个helloworld Java程序需要对类有深度的认识&#xff1a; 对象是类的…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷②

单元测试 一、任务要求 题目1&#xff1a;任意输入2个正整数值分别存入x、y中&#xff0c;据此完成下述分析&#xff1a;若x≤0或y≤0&#xff0c;则提示&#xff1a;“输入不符合要求。”&#xff1b;若2值相同&#xff0c;则提示“可以构建圆形或正方形”&#xff1b;若2<…

ipad协议逆向分析实战篇-1

请使用dnspy环境进行学习研究&#xff0c;切勿用于非法操作 1.首先拿到得到的部署包进行逆向分析 2.解压部署包并找到bin这个文件夹 3.找到Wechat.Api.dll这个文件 4.这两个是协议的核心文件&#xff0c;破解了这个核心文件就可以得出逻辑源码 5.首先把Wechat.Api.dll这个…

Pandas实战100例 | 案例 23: 处理空值

案例 23: 处理空值 知识点讲解 处理空值是数据清洗过程中的一个关键步骤。Pandas 提供了多种方法来检测、填充和删除空值。 检测空值: 使用 isnull 方法可以检测 DataFrame 中的空值。填充空值: 使用 fillna 方法可以填充空值。删除包含空值的行或列: 使用 dropna 方法可以删…

C++ (MFC) 单程序运行(防止多开程序)

C (MFC) 单程序运行&#xff08;防止多开程序) 项目文件名:MFCAppTest 在 C*****App.cpp 文件中 CMFCAppTestApp::InitInstance 函数中 添加以下代码 //避免程序的多开 xxxx为信号量的名字 可随意CreateMutex(NULL, TRUE, TEXT("MFCAppTest")); if (GetLastError…

oracle—IMU机制

正常的情况下&#xff0c;当事务需要回滚块的时候&#xff0c;是去undo表空间找 现在是在sharepool中分一个IMUbuffer&#xff0c;将所有的回滚信息写入。直接就可以从中取。减少了物理IO 同时这个过程也产生redo&#xff0c;直接就是图中红色的&#xff0c;不防止崩溃 优点 1…

开机自启动android app

Android App开机自启动_android 开机自启动-CSDN博客 注意权限问题&#xff1a; 第二种实现方式&#xff1a;系统桌面应用 问&#xff1a;android的系统桌面应用启动是什么&#xff1a; 答&#xff1a; Android 系统桌面应用是指用户在设备主屏幕上看到的默认启动界面&…

代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点面试题 02.07. 链表相交、142.环形链表II

文档讲解&#xff1a;虚拟头节点&#xff0c;三指针&#xff0c;快慢指针&#xff0c;链表相交&#xff0c;环形链表&#xff0c; 技巧&#xff1a; 1、对于指针的操作要画图&#xff0c;明确步骤后好做了 2、使用虚拟头节点可以避免对头节点单独讨论&#xff0c;且方便对头节点…

C++ Primer 6.1 函数基础

函数的形参列表 int func(int v,int v2) {int v,v2;//&#xff01;错误 } 函数返回类型 不能是数组和函数&#xff08;两者都不接受对拷&#xff09;&#xff0c;但可以是指针 局部对象 形参和函数体内部的变量称为局部变量&#xff0c;仅在函数内部可见&#xff0c;隐藏外部…

c++的map的内存布局

以下均基于x86平台64位CentOS或Ubuntu&#xff0c;g8。 有一个指针偶尔会置成0xffffffff&#xff0c;大佬查了几天发现是由于对map的end迭代器进行了错误操作导致的。简化代码如下&#xff1a; struct s_t {std::map<long, int> m;void *p; }; int main() {s_t s;auto …

Python 安卓开发:Kivy、BeeWare、Flet、Flutter

kivy&#xff1a;https://github.com/kivy python-for-android &#xff1a;https://python-for-android.readthedocs.io/en/latest/ BeeWare&#xff1a;https://docs.beeware.org/en/latest/ Flet&#xff1a;https://github.com/flet-dev/flet 把 PySide6 移植到安卓上去&a…

权值初始化

一、梯度消失与爆炸 在神经网络中&#xff0c;梯度消失和梯度爆炸是训练过程中常见的问题。 梯度消失指的是在反向传播过程中&#xff0c;梯度逐渐变小&#xff0c;导致较远处的层对参数的更新影响较小甚至无法更新。这通常发生在深层网络中&#xff0c;特别是使用某些激活函…

Pandas实战100例 | 案例 18: 列操作 - 重命名、删除和重新排序列

案例 18: 列操作 - 重命名、删除和重新排序列 知识点讲解 在处理 DataFrame 时&#xff0c;经常需要对列进行各种操作&#xff0c;如重命名列、删除列或重新排序列。Pandas 提供了简洁的方法来执行这些任务。 重命名列: 使用 rename 方法可以改变 DataFrame 中一个或多个列的…

C++STL

STL基本概念 standard template library : 标准模板库STL从广义上可以分为&#xff1a; 容器(container) 算法(algorithm) 迭代器(iterator)。 容器和算法之间通过迭代器进行无缝连接。 STL几乎所有的代码都采用了模板类或者模板函数STL六大组件 STL的容器 STL的容器就是将运…

vmlinux, System.map; cmake的find_package(Clang)产生的变量们; geogebra单位切向量(简单例子)

linux4.15.y内核中的函数个数 依赖关系: vmlinux, vmlinux.bin, bzImage cd /bal/linux-stable/ file vmlinux #vmlinux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[sha1]b99bbd9dda1ec2751da246d4a7ae4e6fcf7d789b, not str…

uniapp组件定义

自定义组件 新建在/components/组件名.vue文件 组件文档结构 <template><view>......</view> </template> <script>export default {name: "组件名称",//属性自定义props: {属性名称: {type: String, //属性类型value: "值&quo…

SQL Server 配置远程连接

Windows 安装好 SQL Server 的 SSMS,打开SSMS配置远程连接 找到 配置管理器 启用 TCP/IP 打开防火墙设置 新建入站规则 端口TCP - 特定本地端口 (1433)允许连接下一步名称完成 重启 SQL Server 服务

ubuntu安装node

1 下载 node 官网下载 如果需要其他版本&#xff0c;点击上图的Other Downloads 这里下载的版本是20.11.0 Linux Binaries (x64)&#xff0c;下载下来后是node-v20.11.0-linux-x64.tar.xz这样的格式&#xff0c;直接右键解压得到如下目录&#xff1a; 直接拷贝该文件夹到指定目…