博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1119 Pre- and Post-order Traversals
阅读量:7180 次
发布时间:2019-06-29

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

题意:由前序序列和后序序列构建二叉树(保证树的结点值均不相同),若构建的二叉树唯一,输出Yes和其中序序列;若不唯一,输出No和任意一个二叉树的中序序列。

思路:首先,假定区间下标从0开始,即[0,n-1]。

1.一开始,前序序列的第一个结点和后序序列的最后一个结点相同,且为树的根结点。这一点是确定的。
2.前序序列的第二个值(记为kid)为根结点的孩子节点,但不确定是左孩子还是右孩子。
3.在后序序列中找到kid的位置(下标记为pos),则在后序序列中,位于pos之前的结点均为结点kid的孩子结点(即区间postorder[postL,pos)),记录以kid为根结点的子树的结点个数subTreeCnt=pos-postL+1。
4.1.若在前序序列中,结点kid之后(包括kid本身)的所有结点个数恰为subTreeCnt个(即subTreeCnt==preR-preL),则说明原根结点只有一个孩子结点,即kid,只是无法确定kid是原根结点的左孩子还是右孩子,说明可构建的二叉树不唯一,因为题目无明确要求,在不确定的情况下可统一当做左孩子(或右孩子)处理。
4.2.若在前序序列中,结点kid之后(包括kid本身)的所有结点个数不为subTreeCnt个(其实是大于subTreeCnt个),说明原根结点含有两个孩子结点,则对序列进行递归划分。此时,即——
左子树:preorder[preL+1,preL+subTreeCnt],postorder[postL,pos]
右子树:preorder[preL+1+subTreeCnt,preR],postorder[pos+1,postR-1]
注意点:虽然都是递归处理,但是这与【前/后序列+中序序列-->二叉树】的做法还是有细微差别的。本题中,
划分的依据不是原根结点本身,而是前序序列的第二个值(即原根结点的某个孩子节点)

代码:

#include 
struct Node{ int val; Node *lchild,*rchild; Node(int v):val(v),lchild(NULL),rchild(NULL){}};int pre[35],post[35];bool beUnique=true;int n;Node* buildBiTree(int preL,int preR,int postL,int postR){ if(preL>preR) return NULL; if(preL==preR) return new Node(pre[preL]); int rootval=pre[preL], kid=pre[preL+1]; Node* root=new Node(rootval); int pos=postL; while(post[pos]!=kid) pos++; int subTreeCnt=pos-postL+1; if(subTreeCnt==preR-preL){ beUnique=false; root->lchild=buildBiTree(preL+1,preR,postL,pos); root->rchild=NULL; }else{ root->lchild=buildBiTree(preL+1,preL+subTreeCnt,postL,pos); root->rchild=buildBiTree(preL+subTreeCnt+1,preR,pos+1,postR-1); } return root;}void inOrderTraversal(Node* root){ static int cnt=0; if(root){ inOrderTraversal(root->lchild); printf("%d",root->val); cnt++; if(cnt
rchild); }}int main(){ scanf("%d",&n); for(int i=0;i

 

 

 

转载于:https://www.cnblogs.com/kkmjy/p/9523249.html

你可能感兴趣的文章
传微软2.5亿美元收购输入法应用SwiftKey
查看>>
向万物互联进发!中国电信智慧双创物联网示范基地启动
查看>>
赛门铁克警告Switch模拟器下载链接实为垃圾站点
查看>>
Facebook 为何要放弃辟谣?
查看>>
抓住“智慧城市”的机遇
查看>>
摩拜联手高通中移动 剑指最大物联平台步子太大?
查看>>
管理工具Meta SaaS完成150万美元融资,继续加强市场推广
查看>>
大数据,让知识成为一种服务
查看>>
二十款免费WiFi黑客(渗透测试)工具
查看>>
《嵌入式设备驱动开发精解》——第1章 关于本教程
查看>>
Aviator(表达式执行引擎)发布1.0.1
查看>>
海量高性能列式数据库HiStore技术架构解析
查看>>
Linux块设备驱动之内存模拟块设备
查看>>
「技术大牛」是如何缩短事件平均解决时间的?
查看>>
新人成长:新人如何快速融入技术实力强的前端团队
查看>>
Testing Flutter apps翻译-性能分析
查看>>
手把手教你用 node 玩跳一跳
查看>>
SQL 优化
查看>>
如何在SpringBoot中集成JWT(JSON Web Token)鉴权
查看>>
Redis应用场景及常见问题
查看>>