当前位置: 首页 > ai >正文

代码随想录刷题Day40

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

首先,得知道中序遍历和后序遍历的特点:        

  • 中序遍历是:左中右
  • 后序遍历是:左右中

这道题的大致思路:

  1. 后序遍历的最后一个值是“”也就是一棵树的根节点。
  2. 找到“中”后,再去中序遍历结果中找出左子树的序列长度和中序遍历序列,以及右子树的中序遍历序列
  3. 左子树的中序遍历的序列长度会和后序遍历长度一样,所以可以从后序遍历结果中接着提取左子树的后序遍历序列右子树后序遍历序列
  4. 以“中”的值以及递归创建的左右子树的指针创建一棵树并返回。

代码(这份代码是最初的思路,并不是最高效的方式,因为每一次递归都会创建4个向量,最直接的方式其实是原地扫描两个序列向量,只需要传递下标值就好):

class Solution {
public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int len = postorder.size();//递归的终点状态是节点为空if(len == 0 ) return nullptr;int left_size;//后序的最后一个节点是“左右中”的中,在中序遍历里找到该节点int mid_val = postorder[len-1];//确定左子树的序列范围for(int i = 0;i<len;i++){if(inorder[i]==mid_val){left_size = i;break;}}//确定左右子树的中序遍历和后序遍历序列vector<int> left_inorder(inorder.begin(),inorder.begin()+left_size);vector<int> left_postorder(postorder.begin(),postorder.begin()+left_size);vector<int> right_inorder(inorder.begin()+left_size+1,inorder.end());vector<int> right_postorder(postorder.begin()+left_size,postorder.end()-1);//递归创建左右子树,左右子树的序列范围是一样的长度return new TreeNode(mid_val,buildTree(left_inorder,left_postorder),buildTree(right_inorder,right_postorder));}
};

最大的二叉树

这道题的思路类似上一题递归构建树的方式:

  1. 先找到根节点:最大值
  2. 确定左子树的序列和右子树的序列
  3. 递归构建左右子树,并返回构建好的树的地址

代码:

class Solution {
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {int len = nums.size();if(len ==0) return nullptr;int max_val = nums[0];int max_index = 0;//确定根:数组的最大值for(int i = 0;i<len;i++){if(max_val < nums[i]){max_val = nums[i];max_index = i;}}//递归构建左右子树,并返回新的树vector<int> left_nums(nums.begin(),nums.begin()+max_index);vector<int> right_nums(nums.begin()+max_index+1,nums.end());return new TreeNode(max_val,constructMaximumBinaryTree(left_nums),constructMaximumBinaryTree(right_nums));}
};

小结一下,这两道题的思路差不多一致,都是先找出根节点,左子树序列,右子树序列,然后递归生成树。

http://www.xdnf.cn/news/18382.html

相关文章:

  • Linux 软件包安装和管理的相关操作及使用总结(未完成)
  • 漏洞分析 | Kafka Connect 任意文件读取漏洞(CVE-2025-27817)
  • 如何使用AI大语言模型解决生活中的实际小事情?
  • 【Protues仿真】基于AT89C52单片机的LCD液晶显示屏显示控制
  • 如何在 Axios 中处理多个 baseURL 而不造成混乱
  • portainer-ce汉化版下载
  • 从零开始的云计算生活——第四十九天,长路漫漫,kubernetes模块之持久化存储
  • 拆解本地组策略编辑器 (gpedit.msc) 的界面和功能
  • Kafka消息丢失的场景有哪些
  • ThingsBoard运行linux应用版本
  • FPGA设计中的信号完整性量化与优化:探索高速数字系统的关键路径
  • CVPR 2025 | 哈工大港大DeCLIP:解耦CLIP注意力实现开放词汇感知!
  • 车载中控:汽车的数字大脑与交互核心
  • 【RA-Eco-RA4E2-64PIN-V1.0 开发板】步进电机驱动
  • CISP-PTE之路--14文
  • JavaEE 初阶第二十期:网络编程“通关记”(二)
  • 数字隔离器:新能源系统的安全与效能革命
  • 【GM3568JHF】FPGA+ARM异构开发板 测试命令
  • 从零搭建 React 工程化项目
  • 深入解析鸿蒙 ArkTS 中的 @Local 装饰器
  • 【解决办法】wps的word文档编辑时字体的下方出现灰色的底色如何删除
  • CAM可视化卷积神经网络
  • 深度学习:入门简介
  • AI推理革命:从Sequential Thinking到Agentic AI的演进之路——揭秘大语言模型思维进化的四重奏
  • 上海人工智能实验室开源基于Intern-S1同等技术的轻量化开源多模态推理模型
  • logback-spring.xml 文件
  • 车载 GPS 与手机导航的终极对决:谁在复杂路况下更胜一筹?
  • UE5 将纯蓝图项目转为 C++ 项目
  • MongoDB 完整指南
  • 安全运维过程文档体系规范