代码随想录算法训练营第十五天| 二叉树 513. 找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值

层序遍历

本题用层序遍历可以直接秒了,直接提取每一层中最左边的元素(i=0),然后保存到最后一层即可。

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

迭代遍历

首先先要明确使用递归法,如何判断最后一行,就是深度最大的叶子节点一定是最后一行。因此需要本题定义一个全局参数用于记录当前的行。

确定递归函数的参数和返回值:参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。 前面做题的时候一直卡在函数需要int类型的返回值上,其实可以不需要。本题还需要类里的两个全局变量,maxDepth用来记录最大深度,result记录最大深度最左节点的数值。

确定终止条件:当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。然后如果是目前的最大深度,可以使用result保存。

确定单层递归的逻辑:在找最大深度的时候,递归的过程中依然要使用回溯,理解回溯过程:首先进入leftNum函数的时候肯定回答道最左边最左下脚那一个数字,此时depth记录的是当时的深度,但是最左边最左下角那个不一定是底层,可以先返回上一层,看一看他的右子树是否更深,需将depth-1.

/*** 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:int maxDepth = INT_MIN;int result;void leftNum(TreeNode* node,int depth){if(!node->left&&!node->right){if(depth>maxDepth){maxDepth=depth;result=node->val; }return;}if(node->left){depth++;leftNum(node->left,depth);depth--;}if(node->right){depth++;leftNum(node->right,depth);depth--;}}int findBottomLeftValue(TreeNode* root) {int depth{0};leftNum(root,depth);return result;}
};

112. 路径总和

确定递归函数的参数和返回类型:需要二叉树的根节点,还需要一个计数器,这个计数器用来计算二叉树的一条边之和是否正好是目标和,计数器为int型。本题需要找到是否有这么一条路径,因此函数类型为bool。

确定终止条件:如果到达叶子节点且count==0,此时可以返回true,否则返回false。当然也可以设置一个值然后与目标值去比对,但是此时会很麻烦,需要多穿一个参数,因此还是直接将目标值减去根结点到叶子节点的值是否为0比较好。

确定单层递归的逻辑:因为终止条件是判断叶子节点,所以递归的过程中就不要让空节点进入递归了。递归函数是有返回值的,如果递归函数返回true,说明找到了合适的路径,应该立刻返回。(前面忽略了函数的返回是否为true)

出现错误:

1.忽略了root为空指针的情况

2.在主函数中,原先写成getsum(root,targetSum),此时没有减去初始值

3.由于设置的函数是bool类型的,在迭代的过程中。没有用到迭代,当结点为true的时候,就没有必要继续运行了。

class Solution {
public:bool getsum(TreeNode* node, int count){if (!node->left && !node->right) {if(!count)return true;else return false;}if(node->left){count-=node->left->val;if(getsum(node->left,count)) return true;count+=node->left->val;}if(node->right){count-=node->right->val;if(getsum(node->right,count)) return true;count+=node->right->val;}return false;}bool hasPathSum(TreeNode* root, int targetSum) {if (root == NULL) return false;return getsum(root,targetSum-root->val);}
};

106. 从中序与后序遍历序列构造二叉树

这题是真不会,直接看视频和题解的思路。

共分六步:

  • 第一步:如果数组大小为零的话,说明是空节点了。

  • 第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。

  • 第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点

  • 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)

  • 第五步:切割后序数组,切成后序左数组和后序右数组

  • 第六步:递归处理左区间和右区间

确定递归函数的参数和返回类型:题目需要得到结点,因此设置类型也应该是结点,然后参数为中序数组以及后续数组。

确定终止条件:当后序数组(中序数组)大小为0时,说明搜索完毕了。

确定单层递归的逻辑:参考前面的六步

class Solution {
public:TreeNode* travelsal(vector<int>& inorder, vector<int>& postorder){if(postorder.size()==0)return NULL;int postval=postorder[postorder.size()-1];TreeNode* root=new TreeNode(postval);// 叶子节点if (postorder.size() == 1) return root;//找到中序数组需要切割的地方int index=0;for(;index<inorder.size();index++){if(inorder[index]==postval)break;}vector<int> inleft(inorder.begin(),inorder.begin()+index);vector<int> inright(inorder.begin()+index+1,inorder.end());// postorder 舍弃末尾元素,因为这个元素就是中间节点,已经用过了postorder.resize(postorder.size() - 1);vector<int> postleft(postorder.begin(),postorder.begin()+index);//这里不需要+1,因为这是后序数组,左右是连着的vector<int> postright(postorder.begin()+index,postorder.end());root->left=travelsal(inleft,postleft);root->right=travelsal(inright,postright);return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if (inorder.size() == 0 || postorder.size() == 0) return NULL;return travelsal(inorder, postorder);}
};

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

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

相关文章

Python 全栈体系【四阶】(十)

第四章 机器学习 十三、决策树分类 1. 决策树 1.1 什么是决策树 决策树是一种常见的机器学习方法&#xff0c;其核心思想是相同&#xff08;或相似&#xff09;的输入产生相同&#xff08;或相似&#xff09;的输出&#xff0c;通过树状结构来进行决策&#xff0c;其目的是…

Unraid APP下载慢解决方法

1.首先你的APP商城能够打开 这里我已下载Jellyfin为例 使用APP查找镜像,是为了获取下面的配置模板 2.修改地址 默认的地址是 lscr.io/linuxserver/jellyfin服务器在国外,被墙了.下载具慢 我们需要把这个下载源修改成国内的 有很多国内的源,但是我觉得阿里的比较快 3.获…

【设计模式-5】抽象工厂模式的代码实现及使用场景

前面我们了解到工厂方法模式通过引入抽象工厂的概念&#xff0c;使得产品对象的创建可以依赖于具体工厂&#xff0c;但是这种设计模式最大的问题是会造成类的数量爆炸式增长。对于这个问题&#xff0c;抽象工厂模式通过引入两个新的概念&#xff1a;产品等级与产品簇&#xff0…

219. 存在重复元素

给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;num…

Docker基础学习(配置、命令)

镜像加速 登录阿里云 docker run hello-world分析命令&#xff1a; 开始–>docker在本机中寻找镜像–>有–>以该镜像为模版生产容器实例运行&#xff1b; 开始–>docker在本机中寻找镜像–>无–>去远端下载镜像并运行&#xff0c;若远端无此镜像则返回错误…

2023年终总结(脚踏实地,仰望星空)

回忆录 2023年&#xff0c;经历非常多的大事情&#xff0c;找工作、实习、研究生毕业、堂哥结婚、大姐买车、申博、读博、参加马拉松&#xff0c;有幸这一年全家人平平安安&#xff0c;在稳步前进。算是折腾的一年&#xff0c;杭州、赣州、武汉、澳门、珠海、遵义来回跑。完成…

ChatGPT怎么帮我上班的

1.解放生产力 1&#xff09;标准格式&#xff0c;完美输出。GPT对于公文等具有一定标准格式的文件&#xff0c;可以进行完美仿写&#xff0c;随随便便以假乱真那都是小菜一碟&#xff0c;这对于经常要开展规范成文的人来说&#xff0c;简直就是个福音&#xff0c;只要前期调教…

厚积薄发11年,鸿蒙究竟有多可怕

​12月20日中国工程院等权威单位发布《2023年全球十大工程成就》。本次发布的2023全球十大工程成就包括“鸿蒙操作系统”在内。入围的“全球十大工程成就”&#xff0c;主要指过去五年由世界各国工程科技工作者合作或单独完成且实践验证有效的&#xff0c;并且已经产生全球影响…

Databend 的安装配置和使用

介绍 Databend 是一个内置在 Rust 中的开源、弹性和工作负载感知的云数据仓库&#xff0c;为 Snowflake 提供了具有成本效益的替代方案&#xff0c;专门对最大的数据集进行复杂分析而设计。 性能&#xff1a; 在存储对象上&#xff0c;能快速进行数据分析。没有索引和分区&a…

C-数据类型的内存表示

目录 刷语法题 把字符串转换成整数 1时遇到数值溢出问题&#xff0c;借此机会回顾一下相关知识。 以下ChatGPT的回复&#xff1a; 数据类型的二进制表示是什么&#xff1f; 数据类型的二进制表示是指如何在计算机内存中用二进制&#xff08;即由 0 和 1 组成&#xff09;的形式…

XMLHttpRequest

目录 创建 XMLHttpRequest 对象配置请求设置请求头发送请求处理响应取消请求loadend XMLHttpRequest 是一个 JavaScript API&#xff0c;它提供了一种在客户端与服务器进行数据交换的方式&#xff0c;可以在不刷新页面的情况下异步更新部分网页内容。虽然现代开发中越来越多地使…