热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据结构:(代码篇002)给定后序和中序遍历,重建这棵树

目录1.理论依据:具体情况下:一般情况下:2.代码1.理论依据:具体情况下:已知后序遍历࿱

目录

1.理论依据:

具体情况下:

一般情况下:

2.代码


 

 

 

 

 

 

1.理论依据:


具体情况下:

已知后序遍历:post1、post2、……、postN,中序遍历:in1、in2、……、inN。

由先序遍历的性质可知:preN是当前二叉树根节点的值,然后,在中序遍历中遍历一遍,找到根节点(记为k),k左侧的就是左子树,k右侧的就是右子树。

左子树的长度:numleft=k-1;

那么,先序遍历中左子树的范围:1~1+numleft-1 , 右子树的范围:1+numleft~N-1

          中序遍历中左子树的范围: 1~k-1 ,右子树的范围:k+1~N


一般情况下:

已知后序遍历:postL、……、postR,中序遍历:inL、in2、……、inR。

由先序遍历的性质可知:postR是当前二叉树根节点的值,然后,在中序遍历中过一遍,找到根节点(记为k),k左侧的就是左子树,k右侧的就是右子树。

左子树的长度:numleft=k-inL;

那么,先序遍历中左子树的范围:postL~postL+numleft-1 , 右子树的范围:postL+numleft~postR-1

           中序遍历中左子树的范围: inL~k-1 ,右子树的范围:k+1~inR

2.代码
 

node* create(int postL,int postR,int inL,int inR){if(postL>postR){ // 先序序列小于0,则返回 return NULL;}node* root=new node;root->data=post[postR]; // 根节点赋值 int k;for(k=inL;klchild=create(postL,postL+numLeft-1,inL,k-1); //对右子树进行递归 root->rchild=create(postL+numLeft,postR-1,k+1,inR);return root;
}

完整的代码:

#include
#include
#include
#include
using namespace std;
#define range 100
#define NULL 0
struct node{int data;node* lchild;node* rchild;
};
node* Root=NULL;
int post[range];
int in[range];
node* create(int postL,int postR,int inL,int inR){if(postL>postR){ // 先序序列小于0,则返回 return NULL;}node* root=new node;root->data=post[postR]; // 根节点赋值 int k;for(k=inL;klchild=create(postL,postL+numLeft-1,inL,k-1); //对右子树进行递归 root->rchild=create(postL+numLeft,postR-1,k+1,inR);return root;
}
void preorder(node* root){ // 先序遍历 if(root==NULL){return ;}printf("%d ",root->data);preorder(root->lchild);preorder(root->rchild);
}
void inorder(node* root){ // 中序遍历 if(root==NULL){return ;}inorder(root->lchild);printf("%d ",root->data);inorder(root->rchild);
}
void postorder(node* root){ // 后序遍历 if(root==NULL){return ;}postorder(root->lchild);postorder(root->rchild);printf("%d ",root->data);
}
void layerorder(node* root){ // 层次遍历 queue s;s.push(root);node* temp=NULL;while(!s.empty()){temp=s.front();s.pop();printf("%d ",temp->data);if(temp->lchild!=NULL) s.push(temp->lchild);if(temp->rchild!=NULL)s.push(temp->rchild);}
}
//测试数据: 10 9 8 7 4 5 6 3 2 1
int main(){int i,j;cout<<"请输入节点个数:"<>j;cout<<"请输入后序遍历:"<>post[i];cout<<"请输入中序遍历:"<>in[i];Root&#61;create(0,j-1,0,j-1);cout<}

 


推荐阅读
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • The“travellingsalesmanproblem”asksthefollowingquestion:“Givenalistofcitiesandthedistancesb ... [详细]
  • 关于初学PHP时的知识积累总结【PHP】
    后端开发|php教程PHP,知识积累后端开发-php教程PHP基础A、初识PHPPHP是与HTML混合使用的嵌入式语言。1、PHP标记默认标记短标记,需在php.ini中将shor ... [详细]
  • 一、腐烂的橘子1、题目描 ... [详细]
  • 用户体验这点事儿
    2009-02-1518:03byMainz,3366visits,网摘,收藏,编辑用户体验设计最近比较热,从以前的轻视UI到现在不管是桌面软件还是网站都开始关注用户 ... [详细]
  • 开发笔记:dice
    本文由编程笔记#小编为大家整理,主要介绍了dice相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 盘子|圆盘_递归与分治策略第一节:递归和典型递归问题
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了递归与分治策略-第一节:递归和典型递归问题相关的知识,希望对你有一定的参考价值。文章目录 ... [详细]
  • Smali代码注入
    以下的内容是对官方MIUIV4移植教程的补充,其中一些工具的使用就不在这里赘述,请大家参考官方教程。好的,话不多说,进入正题 ... [详细]
  • P1144 最短路计数· BFS/dijkstra
    题解其实题目很简单不写了,这里总结一下从这道题目里学到的知识:当最短路的边权都是1时,dijkstraspfa就是BFS如果使用优先队列,内部结构是pair时 ... [详细]
  • Go 中的 init 函数 ... [详细]
  • log4cpp概述与使用实例一、log4cpp概述Log4cpp是一个开源的C类库,它提供了C程序中使用日志和跟踪调试的功能,它的优点如下࿱ ... [详细]
author-avatar
shengxin11
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有