代码随想录刷题随记16 -二叉树5

代码随想录刷题随记16 -二叉树5

513.找树左下角的值

leetcode链接
在树的最后一行找到最左边的值。首先要是最后一行,然后是最左边的值。使用递归法,如何判断是最后一行:就是深度最大的叶子节点一定是最后一行。

注意height的回溯。要在遍历左右节点后对height进行减操作

class Solution {
public:int maxheight;void sub(TreeNode * root,int &height,int & val){ height++;    if(root->left==nullptr&&height>maxheight&&root->right==nullptr){val=root->val;maxheight=height;return;}if(root->left!=nullptr){sub(root->left,height,val);height--;}if(root->right!=nullptr){sub(root->right,height,val);height--;}    }int findBottomLeftValue(TreeNode* root) {int val=0;int height=0;maxheight=0;sub(root,height,val);return val;}
};

迭代法
使用层次遍历可以很容易的解决这个问题

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

112. 路径总和

leetcode链接
递归很简单:

class Solution {
public:bool sub(TreeNode* root, int targetSum){targetSum-=root->val;if(targetSum==0&&root->left==nullptr&&root->right==nullptr){return true;}bool left=false;bool right=false;if(root->left!=nullptr){left=sub(root->left,targetSum);}if(root->right!=nullptr){right=sub(root->right,targetSum);}return left||right;}bool hasPathSum(TreeNode* root, int targetSum) {if(root==nullptr)return false;return sub(root,targetSum);}
};

113. 路径总和ii

和上面的题类似的题目
leetcode链接
这道题与上面的题目的不同之处在于要返回的不是有没有这样一条路径,而是要记录并返回所有的路径
涉及回溯的思想,由于sub函数本身就自带回溯,所以left和right节点处不能重复回溯了,如下代码注释所示
解题代码:

class Solution {
public:void sub(vector<vector<int>>& ret,TreeNode* root, int targetSum,vector<int> & path){targetSum-=root->val;path.push_back(root->val);if(root->left==nullptr&&root->right==nullptr&&targetSum==0){ret.push_back(path);path.pop_back();return;}if(root->left!=nullptr){//path.push_back(root->left->val);sub(ret,root->left,targetSum,path);//path.pop_back();}if(root->right!=nullptr){//path.push_back(root->right->val);sub(ret,root->right,targetSum,path);//path.pop_back();}path.pop_back();}vector<vector<int>> pathSum(TreeNode* root, int targetSum) {vector<vector<int>> ret;vector<int> path;if(root==nullptr)return {};sub(ret,root,targetSum,path);return ret;}
};

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

leetcode链接
递归

class Solution {
public:TreeNode*  sub(vector<int>& inorder, vector<int>& postorder,int endpost,int startpost,int endmid,int startmid){TreeNode * root= new TreeNode(postorder[endpost]);int index=startmid;while(inorder[index]!=root->val&&index<=endmid)index++;int numleft=index-startmid;//左树if(numleft!=0)root->left=sub(inorder,postorder,startpost+numleft-1,startpost,index-1,startmid);//右树int numright=endmid-index;if(numright!=0)root->right=sub(inorder,postorder,endpost-1,startpost+numleft,endmid,index+1);return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if(inorder.size()==0)return nullptr;return sub(inorder,postorder,postorder.size()-1,0,inorder.size()-1,0);}
};

105.从前序与中序遍历序列构造二叉树

leetcode链接
套路和从中序与后序中恢复树是一样的

class Solution {
public:TreeNode* sub(vector<int>& preorder, vector<int>& inorder,int prestart,int preend,int midstart,int midend  ){TreeNode * root=new TreeNode(preorder[prestart]);int index=midstart;while(inorder[index]!=root->val&&index<=midend){index++;}int leftnum=index-midstart;if(leftnum!=0){root->left=sub(preorder,inorder,prestart+1,prestart+leftnum,midstart,index-1);}int rightnum=midend-index;if(rightnum!=0){root->right=sub(preorder,inorder,prestart+ leftnum+1,preend,index+1,midend);}return root;}    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {if(preorder.size()==0)return nullptr;return sub(preorder,inorder,0,preorder.size()-1,0,preorder.size()-1);}
};

前序和中序可以唯一确定一棵二叉树。

后序和中序可以唯一确定一棵二叉树。

前序和后序不能唯一确定一棵二叉树,因为没有中序遍历无法确定左右部分
在这里插入图片描述
tree1 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。

tree2 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。

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

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

相关文章

算法:树形dp(树状dp)

文章目录 一、树形DP的概念1.基本概念2.解题步骤3.树形DP数据结构 二、典型例题1.LeetCode&#xff1a;337. 打家劫舍 III1.1、定义状态转移方程1.2、参考代码 2.ACWing&#xff1a;285. 没有上司的舞会1.1、定义状态转移方程1.2、拓扑排序参考代码1.3、dfs后序遍历参考代码 一…

【牛客】美团2024届秋招笔试第三场编程真题

1.平均数为k的最长连续子数组【有点难度&#xff0c;主要是这个思路是真没想起来】 题意理解&#xff1a; 求最长连续子序列&#xff0c;该子序列满足平均值为k的条件 解题思路&#xff1a; 1.双for循环遍历所有子串&#xff0c;但是超时了 2.第二种思路, 给所有的元素-平均数k…

【Linux网络编程】网络编程套接字(TCP服务器)

【Linux网络编程】网络编程套接字(TCP服务器) 目录 【Linux网络编程】网络编程套接字(TCP服务器)地址转换函数关于inet_ntoa 简单的TCP网络程序TCP sockot API详解socket()bind()listen()accept();connect 完整的TCP服务器代码&#xff08;线程池版&#xff09; 作者&#xff1…

2022软件设计师上半年下午题六

题目 在软件系统中&#xff0c;通常都会给用户提供取消、不确定或者错误操作的选择&#xff0c;允许将系统恢复到原先的状态。现使用备忘录(Memento)模式实现该要求&#xff0c;得到如图6-1所示的类图。Memento包含了要被恢复的状态。Originator创建并在Memento中存储状态。Ca…

FJSP:霸王龙优化算法(Tyrannosaurus optimization,TROA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

穿越代码之海:探寻结构体深层逻辑,展望未来应用新天地

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 结构体作为一种数据结构&#xff0c;其定义和特点决定了它在各种应用中的广泛适用性。随着科技的进步和新兴行业的不断涌现&#xf…

SpringCloud Hystrix 服务熔断、服务降级防止服务雪崩

文章目录 SpringCloud Hystrix 熔断器、服务降级防止服务雪崩需求背景引入依赖启动类加Hystrix注解接口配置熔断常规配置超时断开错误率熔断请求数熔断限流 全局配置可配置项HystrixCommand.Setter参数Command Properties 服务降级 SpringCloud Hystrix 熔断器、服务降级防止服…

【Linux入门】Linux简史

Linux 是什么&#xff1f;Linux 是一款叫做操作系统的软件。 操作系统这款软件有什么样的意义呢&#xff1f;简单来说&#xff0c;比如有顾客买了一台笔记本电脑&#xff0c;这台笔记本电脑由电脑硬件组成&#xff0c;在这堆硬件上一定搭载了一款操作系统。正因为操作系统存在&…

nginx配置实例-反向代理

目录 一、目标-反向代理实现效果 二、安装tomcat 三、配置nginx服务 四、配置反向代理 一、目标-反向代理实现效果 访问过程分析&#xff1a; 二、安装tomcat 1、安装jdk环境 新建/export/server目录 解压jdk 查看是否解压成功 配置jdk软连接 进入jdk的bin目录中&#x…

[Apple Vision Pro]开源项目 Beautiful Things App Template

1. 技术框架概述&#xff1a; - Beautiful Things App Template是一个为visionOS设计的免费开源软件&#xff08;FOSS&#xff09;&#xff0c;用于展示3D模型画廊。 2. 定位&#xff1a; - 该模板作为Beautiful Things网站的延伸&#xff0c;旨在为Apple Vision Pro用户…

在实体类中使用JSONObject对象

有时候我们的业务需求可能字段是json格式&#xff0c;这个时候我们的实体类就对应的也应该是json格式&#xff0c;需要使用到JSONObject这个对象&#xff0c;但是可能会使用不了这个对象&#xff0c;那接下来我将简单介绍如何使用这个对象。 以下为我的实体类中的某个字段&…

Linux进程状态深度解析:探索进程的生命周期

文章目录 一、引言1、进程的概念与重要性2、Linux系统下进程状态的意义3、进程状态与系统性能的关系 二、Linux下进程状态概述1、Linux进程状态的分类2、进程状态信息的获取方法 三、Linux下进程状态详解1、运行状态&#xff08;Running&#xff09;2、可中断睡眠状态&#xff…