博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT甲题题解-1119. Pre- and Post-order Traversals (30)-(根据前序、后序求中序)
阅读量:5154 次
发布时间:2019-06-13

本文共 2153 字,大约阅读时间需要 7 分钟。

(先说一句,题目还不错,很值得动手思考并且去实现。)

题意:根据前序遍历和后序遍历建树,输出中序遍历序列,序列可能不唯一,输出其中一个即可。  

  已知前序遍历和后序遍历序列,是无法确定一棵二叉树的,原因在于如果只有一棵子树可能是左孩子也有可能是右孩子。由于只要输出其中一个方案,所以假定为左孩子即可。下面就是如何根据前序和后序划分出根节点和左右孩子,这里需要定义前序和后序的区间范围,分别为[preL,preR],[postL,postR]。  

  一开始区间都为[1,n],可以发现前序的第一个和后序的最后一个为根节点root,前序的第二个值val为其某子树的根节点(但还无法确定是左孩子or右孩子)。在后序中找对应的值所在的位置postIdx,则postIdx之前的节点均为val的孩子节点,统计其个数num。那么我们就可以划分区间:  

若num个数=preR-preL-1,即val后面的个数都是其子节点,那么二叉树不唯一,将其作为root的左子树处理。

否则划分为左子树区间和右子树对应的前序和后序区间,顺便更新下root的左孩子preL+1,右孩子preL+num+2:

preOrder:[preL+1,preL+num+1],postOrder:[postL,postIdx];
preOrder:[preL+num+2,preR],postOrder:[postIdx+1,postR-1];
然后递归划分即可

拿样例举例:
1 (2) [3 {4 6 7} <5>]
(2) [{6 7 4} <5> 3] 1
不同的括号对应不同的子树区间
第一次递归划分了(2)-(2),[3 4 6 7 5]-[6 7 4 5 3]
由于(2)只有一棵,不继续划分。
第二次递归划分了{4 6 7}-{6 7 4},<5>-<5>
第三次递归划分了(6)-(6),(7)-(7)
结束

#include 
#include
#include
#include
using namespace std;const int maxn=35;int preOrder[maxn];int postOrder[maxn];bool isUnique=true;struct Node{ int left=-1,right=-1;}node[maxn];/*[preL,preR] is current sequence interval of pre-order[postL,postR] is current sequence interval of post-order*/void build(int preL,int preR,int postL,int postR){ if(preL>=preR){ return; } int fa=preL; //前序遍历的第一个为根节点,第二个为子树的根节点,可能是左孩子也可能是右孩子 int val=preOrder[preL+1]; int postIdx; for(int i=postL;i
num){ node[fa].right=preL+num+2; build(preL+num+2,preR,postIdx+1,postR-1); }}bool first=true;void inOrder(int root){ if(root==-1){ return; } inOrder(node[root].left); if(first){ first=false; printf("%d",preOrder[root]); } else printf(" %d",preOrder[root]); inOrder(node[root].right);}int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&preOrder[i]); for(int i=1;i<=n;i++) scanf("%d",&postOrder[i]); build(1,n,1,n); if(isUnique) printf("Yes\n"); else printf("No\n"); inOrder(1); printf("\n"); //否则格式错误 return 0;}
View Code

 

转载于:https://www.cnblogs.com/chenxiwenruo/p/6131046.html

你可能感兴趣的文章
c网购物车流程图
查看>>
xapth(笔记)
查看>>
HTTP 错误 403.6 - Forbidden 解决方案
查看>>
一个小例子介绍Obj-C的函数命名方式
查看>>
关于Bootstrap的理解
查看>>
hdu 2089 数位dp入门
查看>>
I/O的一些简单操作
查看>>
Handbook之012:函数类别构型
查看>>
php取整函数ceil,floor,round,intval的区别
查看>>
局部富文本
查看>>
例题6-7 树的层次遍历
查看>>
2019-2-15 日记
查看>>
那些年我们跳过的 IE坑
查看>>
产生式模型和判别式模型
查看>>
2015.10.13课堂
查看>>
国内最火5款Java微服务开源项目
查看>>
[国嵌攻略][038][时钟初始化]
查看>>
C#格式化字符串
查看>>
剑指offer——二叉搜索树的后序遍历序列
查看>>
2016集训测试赛(二十四)Problem C: 棋盘控制
查看>>