# 1020 Tree Traversals (25分)

## 题目

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 (\le30)$, 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.

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

4 1 6 3 5 7 2

## 思路

 后序 2 3 1 5 7 6 4
 中序 1 2 3 4 5 6 7

 后序 2 3 1 5 7 6 4
 中序 1 2 3 4 5 6 7

void createTree(node *root, int r){ //root父亲节点
int rindex;
for(int i=0; i<n; i++)
if(inorder[i] == postorder[r]){
rindex = i;
break;
}
visited[rindex] = true;//表示访问
int lcn = 0, rcn = 0;
for(int i=rindex-1; !visited[i]&&i>=0; i--) //统计左子树个数
lcn++;
for(int i=rindex+1; !visited[i]&&i<n; i++)	//统计右子树个数
rcn++;
if(lcn == 0)		//左子树为空，递归结束
root->left = NULL;
else{				//不为空，下一趟递归
node *lc = new node;
lc->data = postorder[r-rcn-1];
root->left = lc;
createTree(lc, r-rcn-1);
}
if(rcn == 0)
root->right = NULL;
else{
node *rc = new node;
rc->data  =postorder[r-1];
root->right = rc;
createTree(rc, r-1);
}
}


## 完整代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

struct node{
int data;
node *left;
node *right;
};

int n;
int postorder[30];
int inorder[30];
int visited[30] = {false};

void createTree(node *root, int r){
int rindex;
for(int i=0; i<n; i++)
if(inorder[i] == postorder[r]){
rindex = i;
break;
}
visited[rindex] = true;
int lcn = 0, rcn = 0;
for(int i=rindex-1; !visited[i]&&i>=0; i--)
lcn++;
for(int i=rindex+1; !visited[i]&&i<n; i++)
rcn++;
if(lcn == 0)
root->left = NULL;
else{
node *lc = new node;
lc->data = postorder[r-rcn-1];
root->left = lc;
createTree(lc, r-rcn-1);
}
if(rcn == 0)
root->right = NULL;
else{
node *rc = new node;
rc->data  =postorder[r-1];
root->right = rc;
createTree(rc, r-1);
}
}

int main(){
scanf("%d", &n);
for(int i=0; i<n; i++)
scanf("%d", &postorder[i]);
for(int i=0; i<n; i++)
scanf("%d", &inorder[i]);
node root;
root.data = postorder[n-1];
createTree(&root, n-1);
queue<node> que;
que.push(root);
while(!que.empty()){
node tmp = que.front();
que.pop();
cout<<tmp.data;
if(tmp.left != NULL)
que.push(*tmp.left);
if(tmp.right != NULL)
que.push(*tmp.right);
if(!que.empty())
cout<<" ";
}
return 0;
}



©️2019 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试