6.二叉树——2.重建树

已知先序和中序序列

  1. 根据先序序列找到树根
  2. 根据树根和中序序列找到左右子树

同理根据后序序列和中序序列也能重构树,但前序和后序不可以

递归coding思路

设先序序列为preorder[n],中序序列为midorder[n]

  1. 大事化小:
    • 确定根,即树根为preorder[0],左子树为preorder[1~ pos],右子树为preorder[pos+1~ n]
    • 找到根,即查询到根在中序序列中的位置为pos,有midorder[0~ (pos-1)]是左子树,midorder[ (pos+1)~n]是右子树
  2. 最小问题:子树序列长度为0——>表明是空树

例题

在这里插入图片描述

代码

#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;struct TreeNode{char data;TreeNode * leftChild;TreeNode * rightChild;
};
struct QueueNode{TreeNode *parent;bool isLeftIn;
};void aftOrder(TreeNode* root){if (root==NULL){return;}aftOrder(root->leftChild);aftOrder(root->rightChild);printf("%c",root->data);
}
TreeNode * rebuild(string preOrder,string midOrder){//rebuild返回根节点地址if (preOrder.size()==0){return NULL;} else{//根据先序序列确定根char root_data = preOrder[0];TreeNode *new_node = new TreeNode;new_node->data = root_data;//用根切割中序序列int pos = midOrder.find(root_data);string left_pre = preOrder.substr(1,pos);//对先序序列切割,取从下标1开始,长度为pos的左子树串string right_pre= preOrder.substr(pos+1);//对先序序列切割,取右子树序列(先序)string left_mid = midOrder.substr(0,pos);string right_mid= midOrder.substr(pos+1);new_node->leftChild = rebuild(left_pre,left_mid);new_node->rightChild = rebuild(right_pre,right_mid);return new_node;}
}int main() {char preOrder[100];char midOrder[100];while(scanf("%s%s",preOrder,midOrder)!=EOF){TreeNode * root = rebuild(preOrder,midOrder);aftOrder(root);printf("\n");}return 0;
}

已知带空树提醒的先序序列

输入一个字符串,即树的先序序列,空叶部分用#填补。

递归coding思路

  1. 大事化小:
    • 读取第一个非#字符:树的根
    • 接下来的非#字符:左子树根
    • 再接下来的非#字符:右子树根
  2. 最小问题:读取到#,表明是空树,需要往回走了

代码

#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;struct TreeNode{char data;TreeNode * leftChild;TreeNode * rightChild;
};
struct QueueNode{TreeNode *parent;bool isLeftIn;
};void midOrder(TreeNode* root){if (root==NULL){return;}midOrder(root->leftChild);printf("%c ",root->data);midOrder(root->rightChild);
}TreeNode * rebuild(string preOrder,string midOrder){//rebuild返回根节点地址if (preOrder.size()==0){return NULL;} else{//根据先序序列确定根char root_data = preOrder[0];TreeNode *new_node = new TreeNode;new_node->data = root_data;//用根切割中序序列int pos = midOrder.find(root_data);string left_pre = preOrder.substr(1,pos);//对先序序列切割,取从下标1开始,长度为pos的左子树串string right_pre= preOrder.substr(pos+1);//对先序序列切割,取右子树序列(先序)string left_mid = midOrder.substr(0,pos);string right_mid= midOrder.substr(pos+1);new_node->leftChild = rebuild(left_pre,left_mid);new_node->rightChild = rebuild(right_pre,right_mid);return new_node;}
}TreeNode * pre_build(int &i,string attached_preorder){char c = attached_preorder[i];++i;if (c =='#'){return NULL;} else{TreeNode * new_node = new TreeNode;new_node->data = c;new_node->leftChild = pre_build(i,attached_preorder);new_node->rightChild = pre_build(i,attached_preorder);return new_node;}
}int main() {char str[1000];scanf("%s",str);int i = 0;TreeNode * root = pre_build(i,str);midOrder(root);return 0;
}

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

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

相关文章

uniapp写小程序如何实现分包

众所众知小程序上传的过程中对包的大小有限制&#xff0c;正常情况下不允许当个包超过2M&#xff0c;所以需要分包 需要再pages.json这个文件夹中进行配置 "pages": [{"path": "pages/index/index","style": {"navigationBarTit…

基于java实现学科竞赛管理系统【Springboot+mybatis+layui】

基于java实现学科竞赛管理系统【Springbootmybatislayui】 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

UMass、MIT等提出3D世界具身基础模型,机器人根据生成的世界模型无缝连接3D感知、推理和行动

在最近的研究中&#xff0c;视觉-语言-动作&#xff08;VLA&#xff0c;vision-language-action&#xff09;模型的输入基本都是2D数据&#xff0c;没有集成更通用的3D物理世界。 此外&#xff0c;现有的模型通过学习「感知到动作的直接映射」来进行动作预测&#xff0c;忽略了…

流量调度平台:优化资源配置,提升用户体验

随着互联网和移动互联网的快速发展&#xff0c;流量调度平台作为一种关键的技术解决方案&#xff0c;正成为各行业提高资源利用率、优化用户体验的重要工具。本文将深入探讨流量调度平台的意义、特点以及在不同领域的应用场景。 ### 什么是流量调度平台&#xff1f; 流量调度…

Hive3.0.0出库库表中timestamp字段读取为null

在利用sqoop1.99.7做数据迁移的时候&#xff0c;从mysql导出表格到hive建立对应的表格&#xff0c;字段中使用了timestamp类型&#xff0c;在读取数据的时候&#xff0c;发现数据为null。查找问题方法如下&#xff1a; 1、查询库表字段类型 命令&#xff1a;desc tablen…

R使用multinma程序包实现生存数据的贝叶斯网状meta分析

前言 multinma是由Phillippo开发的程序包&#xff0c;主要用来实现基于IPD校准的多水平网状Meta回归&#xff08;ML-NMR&#xff09;&#xff0c;同时该程序包也可以用来实现传统的网状meta分析。今天的文章介绍如何使用multinma程序包实现生存数据的贝叶斯网状meta分析&#…

学习JavaEE的日子 Day29 yield,join,线程的中断,守护线程,线程局部变量共享,线程生命周期

Day29 多线程 12. 线程的礼让 Thread.yield(); 理解&#xff1a;此方法为静态方法&#xff0c;此方法写在哪个线程中&#xff0c;哪个线程就礼让 注意&#xff1a;所谓的礼让是指当前线程退出CPU资源&#xff0c;并转到就绪状态&#xff0c;接着再抢 需求&#xff1a;创建两个…

SPRING-BOOT实现HTTP大文件断点续传分片下载

版本&#xff1a;6.5.40 代码&#xff1a;up6-jsp-springboot: Web大文件上传-jsp-springboot示例 - Gitee.com nosql示例 nosql示例不需要进行任何配置&#xff0c;可以直接访问测试。 SQL示例 1.创建数据库 2.配置数据库连接 3.自动下载maven依赖 4.启动项目 启动成功 6.访…

肿瘤靶向肽 iRGD peptide环肽 1392278-76-0 c(CRGDKGPDC)

RGD环肽 c(CRGDKGPDC)&#xff0c;iRGD peptide 1392278-76-0 结 构 式&#xff1a; H2N-CRGDKGPDC-OH(Disulfide Bridge:C1-C9) H2N-Cys-Arg-Gly-Asp-Lys-Gly-Pro-Asp-Cys-COOH(Disulfide Bridge:Cys1-Cys9) 氨基酸个数&#xff1a; 9 C35H57N13O14S2 平均分子量:…

【机器学习之旅】概念启程、步骤前行、分类掌握与实践落地

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

国赛大纲解读

1. 第一部分,是针对5G基础知识的掌握,第二部分是人工智能基本算法的掌握,就是人工智能的应用,用5G+人工智能(AI算法)进行网络优化的问题,要有网络优化的基础知识,比如说:某个区域的覆盖问题,覆盖特别差,但有数据,覆盖电频,srp值这些数据给你,根据数据来判断是…

针对COT控制模式下低ESR电容造成次谐波振荡问题的片内斜波补偿方案

COT模式&#xff1a;MOS管固定导通时间控制模式&#xff0c;关断时间由输出反馈电压与内部基准源的相较值决定。 RBCOT控制模式&#xff1a;Ripple-Based COT基于纹波的固定导通时间控制方法&#xff0c;特别的是环路控制部分主要有固定导通时间发生装置及比较器组成。RBCOT控…