码迷,mamicode.com
首页 > 其他好文 > 详细

1020 Tree Traversals (25 分)

时间:2019-01-06 14:22:02      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:case   null   stream   tree   ecif   std   cout   sam   osi   

Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

Sample Output:

4 1 6 3 5 7 2

基本思路:
  1、因为中序遍历和后序遍历可以唯一确定一棵二叉树,所以首先构造处这颗树,然后进行层序遍历即可
  2、建立二叉树的时候要判断左右子树长度为0,并且要注意参数的值传递。具体如何做可参考代码。
  
#include<iostream>
#include<sstream>
#include<algorithm>
#include<map>
#include<cmath>
#include<cstdio>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;
struct Node
{
    int data;
    Node *lchild,*rchild;
};

void CreateTree(int inOrder[],int iL,int iR,
                 int postOrder[],int pI,int pR,Node *&root)
{
    int temp=0;
    while(inOrder[temp]!=postOrder[pR]) temp++;
    int leftLength=temp-iL;
    int rightLength=iR-temp;
    if(root==nullptr)
    {
        root =new Node();
        root->data=postOrder[pR];
    }
    if(leftLength>0)
        CreateTree(inOrder,iL,temp-1,postOrder,pI,pR-rightLength-1,root->lchild);
    if(rightLength>0)
        CreateTree(inOrder,temp+1,iR,postOrder,pI+leftLength,pR-1,root->rchild);

}
int a[31];
void level(Node *root)
{
    queue<Node*> q;
    q.push(root);
    int i=0;
    while(!q.empty())
    {
        Node *temp=q.front();
        q.pop();
        a[i++]=temp->data;
        if(temp->lchild)
            q.push(temp->lchild);
        if(temp->rchild)
            q.push(temp->rchild);
    }
}

int main()
{
    int n;
    cin>>n;
    int postOrder[n],inOrder[n];
    for(int i=0; i<n; i++)
        cin>>postOrder[i];
    for(int i=0; i<n; i++)
        cin>>inOrder[i];
    Node *root=nullptr;
    CreateTree(inOrder,0,n-1,postOrder,0,n-1,root);
    level(root);

    if(n>0)
        cout<<a[0];
    for(int i=1;i<n;i++)
        cout<<" "<<a[i];

    return 0;
}

 

 

1020 Tree Traversals (25 分)

标签:case   null   stream   tree   ecif   std   cout   sam   osi   

原文地址:https://www.cnblogs.com/zhanghaijie/p/10228464.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!