PAT1119 Pre- and Post-order Traversals(先序后序求中序)
题意:
给出先序和后序,要求如果能形成唯一的树就输出yes和中序,如果不能就输出no和任意一个中序
思路:
这题就是递归建树,根据后序中倒数第二个数到先序中寻找对应的位置,如果后序的倒数第二个数和先序的第二个数相同就说明不唯一,此时选择将其作为右子树。我这题写的时候考虑复杂了,想着同时用先序的第二个数和后序的倒数第二个数去拆分树,实际上只要选择其中一个就行,然后递归的时候如果不唯一,只有一个点的时候要特判,直接返回点。
#include<bits/stdc++.h>
using namespace std;
const int maxn=50;
int pre[maxn],post[maxn];
int n;
bool flag=true;
vector<int> res;struct node{int key;node *left,*right;
};node* dfs(int l,int r,int ll,int rr){if(l>r||ll>rr)return nullptr;node *root=new node();root->key=pre[l];root->left=nullptr;root->right=nullptr;if(l==r)return root;int pos;for(pos=l+1;pos<=r;pos++){if(pre[pos]==post[rr-1])break;}int numleft=pos-l-1;int numright=r-pos+1;if(pos-l>1){root->left=dfs(l+1,pos-1,ll,ll+numleft-1);root->right=dfs(pos,r,rr-1-numright+1,rr-1);}else{flag=false;root->right=dfs(pos,r,rr-1-numright+1,rr-1);}return root;
}void inorder(node *root){if(root==nullptr)return;inorder(root->left);res.push_back(root->key);inorder(root->right);
}int main(){scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&pre[i]);}for(int i=0;i<n;i++){scanf("%d",&post[i]);}node *root=dfs(0,n-1,0,n-1);if(flag)cout<<"Yes"<<endl;elsecout<<"No"<<endl;inorder(root);for(int i=0;i<res.size();i++){if(i!=0) printf(" ");printf("%d",res[i]);}printf("\n");return 0;
}
转载于:https://www.cnblogs.com/seasonal/p/10343598.html
PAT1119 Pre- and Post-order Traversals(先序后序求中序)相关推荐
- 二叉树排序--简单明了(知道前序后续求中序..)
前序.中序.后序遍历的特性: 前序遍历: 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历: 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历: 1.后序遍历左子树 2 ...
- 二叉树前序后序求中序序列
题目: 给定一棵有n个结点的二叉树的先序遍历与后序遍历序列,求其中序遍历序列. 若某节点只有一个子节点,则此处将其看做是左儿子结点. 示例 输入 5,[3,2,1,4,5],[1,5,4,2,3] 输 ...
- 给定二叉树的先序遍历和中序遍历,求其后序遍历(先中定序)
题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: ...
- 根据先序遍历数列和中序遍历数列重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 二叉树知道前序和中序求后序,知道中序后序求中序
今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看 ...
- 二叉树:已知先序和中序求后序,已知中序和后序求先序
树的三种遍历方式的遍历顺序: 先序遍历:根.左子树.右子树(特点:第一个元素为根) 中序遍历:左子树.根.右子树(特点:根的两边分别为左子树和右子树) 后序遍历:左子树.右子树.根(特点:最后一个元素 ...
- 用数学归纳法证明二叉树的先序遍历序列和中序遍历序列可以唯一确定一颗二叉树
用数学归纳法证明二叉树的先序遍历序列和中序遍历序列可以唯一确定一颗二叉树. 首先说明:思想来自文都考研洪老师.包括逻辑框架的搭建,此篇文章为框架搭建完成后将细节补充完整. 首先,用到的数学的证明思想是 ...
- PAT甲级1119 Pre- and Post-order Traversals (30分):[C++题解]暴搜dfs、前序遍历和后序遍历求中序遍历
文章目录 题目分析 题目链接 题目分析 分析 给了前序遍历和后序遍历,能够确定根结点,但是左子树和右子树的长度是不确定的.这里采用的解决方案是枚举左子树的结点个数,其实右子树的结点个数也确定了.对于每 ...
- PAT甲级1086 Tree Traversals Again:[C++题解]二叉树中序序列、栈、求后序遍历
文章目录 题目分析 题目链接 题目分析 分析: 给定栈模拟的二叉树的中序序列. 我们可以发现一些性质: 1 第一个值是根结点. 2 对于所有的push操作,如果上一个是push,该结点就是上一个结点的 ...
最新文章
- JS控制图片显示的大小(图片等比例缩放)
- js判断是由含有a节点_如何在 JS 中判断数组是否包含指定的元素(多种方法)
- list.h在用户态下的应用
- Cortex‐M3-存储器保护单元(MPU)
- 22 款设计和可视化神经网络的工具
- java dbcursor_优化JAVA查询Mongodb数量过大,查询熟读慢的方法
- 设置行间距_word打印技巧:几个节省纸张的打印设置方法
- 机器学习十大经典算法-KMeans
- android 广告字幕,Android编程实现类似天气预报图文字幕垂直滚动效果的方法
- 公文处理助手 【全自动文档排版插件 For Word(32/64)】
- 水果食用大全 -- 果品食疗 - 雪梨
- (19年最新,操作极简)linux下使用xmind zen破解版
- C#中XML、JSON、类T数据格式之间的转换
- 电脑重装:微PE工具箱重装win10系统
- 教你几招HASH表查找的方法
- 【C++】7-41 互评成绩(PTA)
- 数据库:MySQL 修改密码
- 客户端与服务器的数据传输
- 情不知所起,一 网 而深
- 在线沙盒(恶意软件行为分析工具)整理介绍