数据结构与算法学习day21-二叉树

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

1.题目

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

2.思路

以后序(左右中)数组的最后一个元素为切割点(根节点),切割的节点切中序(左中右)数组,左边为左子树,右边为右子树。

怎么进行下一步切割?

需要找出左右子树的后序数组。

中序数组和后序数组的左右子树长度一定是相等的。根据中序切割出来的左右子树的数据长度,

再切后序数组,切出后序数组的左右子树。

一层一层切下去,每次后序数组最后一个元素就是节点元素。

class Solution {
private:TreeNode* treaversal(vector<int>& inorder, vector<int>& postorder){//如果是空的,直接返回空指针if(inorder.size() == 0) return NULL;//后续遍历数组最后以一个节点就是根节点int getroot = postorder[postorder.size()-1];TreeNode* root = new TreeNode(getroot);//终止条件if (postorder.size() == 1) return root;//开始分割中序数组,分成左右两个数组//左闭右开区间int i;for(i = 0;i < inorder.size(); i++){if(inorder[i] == getroot) break;}vector<int> left_inorder(inorder.begin(),inorder.begin()+i);vector<int> right_inorder(inorder.begin()+i+1,inorder.end());//舍弃后序数组最后一个分割元素postorder.resize(postorder.size()-1);//根据分割完的左右数组大小分割后序遍历的数组vector<int> left_postorder(postorder.begin(),postorder.begin()+left_inorder.size());vector<int> right_postorder(postorder.begin()+left_inorder.size(),postorder.end());root->left  = treaversal(left_inorder,left_postorder);root->right = treaversal(right_inorder,right_postorder);return root;}public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {return treaversal(inorder,postorder);}
};

二、最大二叉树

1.题目

654. 最大二叉树 - 力扣(LeetCode)

2.思路

构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。

1.确定递归函数的参数和返回值

2.确定终止条件

题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。 这表示一个数组大小是1的时候,构造了一个新的节点,并返回。

3.确定单层递归的逻辑

  1. 先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组。
  2. 最大值所在的下标左区间 构造左子树,这里要判断maxIndex > 0,因为要保证左区间至少有一个数值。
  3. 最大值所在的下标右区间 构造右子树,判断maxIndex < (nums.size() - 1),确保右区间至少有一个数值。

总体代码:

class Solution {
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {//结束条件TreeNode* node = new TreeNode(0);if(nums.size() == 1){node->val = nums[0];return node;}//int max = 0;int maxIndex = 0;for(int i = 0; i < nums.size();i++){if(nums[i] > max){max = nums[i];maxIndex = i;}}//根节点node->val = max;//左if(maxIndex > 0){vector<int> leftnums(nums.begin(),nums.begin()+maxIndex);node->left  = constructMaximumBinaryTree(leftnums);}//右if(maxIndex < nums.size()-1){vector<int> rightnums(nums.begin()+maxIndex+1,nums.end());node->right = constructMaximumBinaryTree(rightnums);            }return node;}
};

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

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

相关文章

初学者指南:MyBatis 入门教程

主要介绍了Mybatis的基本使用、JDBC、数据库连接池、lombok注解&#xff01; 文章目录 前言 什么是Mybatis? 快速入门 使用Mybatis查询所有的用户信息 配置SQL提示 JDBC介绍 Mybatis 数据库连接池 lombok 总结 前言 主要介绍了Mybatis的基本使用、JDBC、数据库连接…

Tableau学习日记

Day1&#xff1a;Tableau简介、条形图与直方图 1.Tableau绘制条形图 1.1 条形图1&#xff1a;各地区酒店数量 1.2 条形图2&#xff1a;各地区酒店均价 1.3 堆积图&#xff1a;价格等级堆积图 2.Tableau绘制直方图 2.1创建评分直方图 Day2&#xff1a;Tableau简介、条形图与直…

Flutter类

Dart中的对象都继承自 Object 类&#xff0c;单继承&#xff08;extend关键字&#xff09;。Dart与Java、kotlin不同的是其无public、private、protected修饰符&#xff0c;默认public &#xff0c;通过在属性名、方法名前加 _下划线 来定义是否私有。 实现一个简单的类 class…

pod被驱逐追溯根因

背景 收到pod报警&#xff0c;看到其状态是error&#xff0c;新的pod又在另外一台机器上起来了。 原因分析 describe pod看到pod被驱逐 Status: Failed Reason: Evicted Message: The node was low on resource: ephemeral-storage. Containe…

数据结构之红黑树的 “奥秘“

目录&#xff1a; 一.红黑树概念 二. 红黑树的性质 三.红黑树的实现 四.红黑树验证 五.AVL树和红黑树的比较 一.红黑树概念 1.红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何 一条从根…

YOLO配合 PYQT做自定义虚拟电子围-自定义绘制多边形虚拟电子围栏

电子围栏标注以及显示 1、目标检测&#xff1a; YOLO可以识别检测物体&#xff0c;这是众所周知的。使用YOLO来做目标检测&#xff0c;并获取坐标信息。 2、电子围栏 比如在监控中&#xff0c;指定一块区域&#xff0c;如果有目标进入&#xff0c;则发出警报&#xff0c;并提…

《基于深度半监督学习的目标检测综述》泛读

基于深度半监督学习的目标检测方法分为 1、生成式方法 2、一致性正则化方法 3、基于图的方法 4、伪标记方法和混合方法 然后基于常用数据集 对典型方法进行了性能对比&#xff0c;最后分析了其挑战和发展趋势&#xff0c;旨在为相关研究提供参考 收获就是&#xff1a; 1…

JMeter 入门之远程启动,服务模式,多机联测,负载均衡测试

本文主要介绍 JMeter 远程启动及使用多节点完成大并发测试&#xff08;负载均衡测试&#xff09;&#xff0c;主打一个压力山大&#xff0c;借用 黑神话&#xff1a;悟空 的技能来描述就是远程开大&#xff0c;释放猴子猴孙技能。 搜了一些 jmeter 的案例或教程&#xff0c;讲的…

MyBatis-Plus分页查询、分组查询

目录 准备工作1. 实体类2. Mapper类3. 分页插件4. 数据 分页查询1. 使用条件构造器2. 使用自定义sql 分组查询1. 分组结果类2. 自定义sql3. 测试类 准备工作 1. 实体类 对地址字段address使用字段类型转换器&#xff0c;将List转为字符串数组保存在数据库中 package com.exa…

Docker 部署 Redis (图文并茂超详细)

部署 Redis ( Docker ) [Step 1] : 拉取 Redis 镜像, 推荐使用 7 的 Redis 版本 docker pull redis:7.0.12[Step 2] : 创建 Redis 相关目录 ➡️ 启动 Redis 容器 ➡️ 拷贝文件 ➡️ 授权文件夹 ➡️ 删除容器 # 创建 Redis 相关目录 mkdir -p /data/redis/{conf,data,log…

探索Python中文拼音转换的奥秘:xpinyin库

文章目录 **探索Python中文拼音转换的奥秘&#xff1a;xpinyin库**背景介绍库简介安装指南函数使用示例应用场景常见问题与解决方案总结 探索Python中文拼音转换的奥秘&#xff1a;xpinyin库 背景介绍 在处理中文文本数据时&#xff0c;我们经常需要将中文字符转换为拼音。无…

【LabVIEW学习篇 - 23】:简单状态机

文章目录 简单状态机状态机的创建和了解状态机实现红绿灯 简单状态机 一个优秀的应用程序离不开好的程序框架&#xff0c;不仅要很好满足用户的功能需求&#xff0c;还要考虑到系统的稳定性、实时性、可扩展性、可维护性&#xff0c;执行效率等方面。借用一些成熟的设计框架&a…

【C++】string类的基本使用

一、string类的由来 在C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列 的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户 自己管…

MBD_入门篇_23_SimulinkSinks

23.1 概述 Sink库里面是Simulink的显示或导出信号数据的模块&#xff0c;可以理解为信号的最后接收的模块&#xff0c;要么用于显示要么用于传递给更上层的系统要么终止。 Sink库里面的模块都只有输入&#xff0c;没有输出。 23.2 回顾常用模块 23.2.1 Display 用于实时仿真…

Computer Exercise

每日一练 单选题 在Word2003中&#xff0c;通过&#xff08;     D    &#xff09;不能设置字符格式。 A.格式菜单     B.格式工具栏     C.格式刷     D.常用工具栏数据库系统而言&#xff0c;主要通过权限和授权来实现安全管理&#xff0c;其中update权限表示&am…

数据库——MySQL概述

一、数据库 存储数据的仓库&#xff0c;数据是有组织的存储&#xff0c;简称database&#xff08;DB&#xff09; 二、数据库管理系统 操控和管理数据库的大型软件&#xff08;DBMS&#xff09; 三、SQL 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库…

Leetcode面试经典150题-134.加油站

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {/**如果只有一个加油站&#xff0c;那它本来就在那个为止&#xff0c;0就是它的编号?但是这只是你的想象&#xff0c;题目有个变态规定&#xff0c;自…

python-古籍翻译

题目描述 小理跑到外星人的图书馆去读书。有一本外星古籍&#xff0c;里面的内容是用八进制写成的&#xff1b;但小理只能处理十六进制的数据。请你帮忙写一个翻译软件&#xff0c;帮小理把八进制串翻译成十六进制串。 输入 仅一行&#xff0c;一个八进制字符串 s&#xff0…

创建Java项目,可实现main方法运行,实现对性能数据的处理

1、Android Studio无法执行Java类的main方法问题及解决方法 Android Studio无法执行Java类的main方法问题及解决方法_delegatedbuild-CSDN博客 D:\workspaces\performanceTools\.idea 文件夹下&#xff0c;gardle.xml ,添加依赖 <option name"delegatedBuild"…

QT:音视频播放器

目录 一.播放器设计 二.需要使用的控件 三.选择视频 四.播放视频 五.暂停视频 六.关闭视频 七.播放状态设置 八.切换视频(上一首) 九.切换视频(下一首) 十.设置视频滑块 十一.更新滑块显示 十二.实现效果 十三.代码设计 1.mainwindow.h 2.mainwindow.cpp 一.播放…