PAT A1119 Pre- and Post-order Traversals [前序后序求中序]

Posted doragd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT A1119 Pre- and Post-order Traversals [前序后序求中序]相关的知识,希望对你有一定的参考价值。

题目描述

链接
给出一棵树的结点个数n,以及它的前序遍历和后序遍历,输出它的中序遍历,如果中序遍历不唯一就输出No,且输出其中一个中序即可,如果中序遍历唯一就输出Yes,并输出它的中序

分析

  • 分析题目所给的正反样例,可以发现,最后递归到单一子树后,左根是它,右根也是它,就不唯一了。此时,可以随便指定为右孩子或者左孩子
  • 具体来说,对先序从前往后找,对后序从后往前找,找到左右子树的根,从而确定左右子树的范围进行递归
  • 当递归到某处,发现当前结点!!的左子树的根和右子树的根重合了\(i==prel+1\)话(\(i\)是右子树的根,\(prel\)是当前根结点,\(prel+1\)是左子树的根),则向下递归时,只向右子树递归
  • 另外还要注意,递归到最后,只剩一个结点即\(prel==prer\),就直接return root了,不用再向下递归了
  • 画下图,模拟下过程就好
#include<bits/stdc++.h>
using namespace std;

const int maxn = 40;
int pre[maxn],post[maxn];
int n;
struct node
    int data;
    node *lchild,*rchild;
;
//root为后序序列的根结点,st,ed为先序的范围
vector<int> ans;
bool flag = true;
node *create(int prel, int prer, int postl, int postr)
    if(prel > prer) return NULL;
    //建立此状态下的根结点
    node *root = new node;
    root->data = pre[prel];
    root->lchild = NULL;
    root->rchild = NULL;
    if(prel==prer)
        return root;
    
    //找左右子树的范围
    //在先序里面找到右子树根节点的位置
    int i;
    for(i=prel;i<=prer;i++)
        if(post[postr-1] == pre[i])
            break;
        
    
    if(i - prel > 1)
        //左子树的范围: prel+1,i-1, 长度i-1-prel 
        root->lchild = create(prel+1,i-1,postl,postl+i-prel-2); //左子树的范围
        //右子树的范围: 
        root->rchild = create(i, prer, postl+i-prel-1, postr-1);
    else //i==prel+1 即左右子树的根节点重合了
        flag = false;
        root->rchild = create(i, prer, postl+i-prel-1, postr-1); //就当成右子树
    
    return root;


void inorder(node *root)
    if(!root) return;
    inorder(root->lchild);
    ans.push_back(root->data);
    inorder(root->rchild);


int main()
    cin>>n;
    for(int i=0;i<n;i++) cin>>pre[i];
    for(int i=0;i<n;i++) cin>>post[i];
    node *root = create(0,n-1,0,n-1);
    inorder(root);
    if(flag) printf("Yes\n");
    else printf("No\n");
    for(int i=0;i<ans.size();i++)
        if(i==0)printf("%d",ans[i]);
        else printf(" %d",ans[i]);
    
    printf("\n");

以上是关于PAT A1119 Pre- and Post-order Traversals [前序后序求中序]的主要内容,如果未能解决你的问题,请参考以下文章

A1119 Pre- and Post-order Traversals (30分)

PAT 1119 Pre- and Post-order Traversals

PAT A 1119. Pre- and Post-order Traversals (30)二叉树遍历

PAT甲级1119 Pre- and Post-order Traversals (30分)(已知先序后序输出是否二叉树唯一并输出中序遍历)

Pre- and Post-order Traversals(先序+后序序列,建立二叉树)

PAT1042