1020. Tree Traversals (25)

题目链接:http://www.patest.cn/contests/pat-a-practise/1020

题目:

1020. Tree Traversals (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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 (<=30), 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)两种遍历构造树会不会,用递归函数写

3)层序遍历会不会,用队列辅助(层序、广搜用队列;深搜用递归、栈)

AC代码:

#include<stdio.h>
#include<queue>
using namespace std;
struct Node{//节点结构体
 Node *lchild;
 Node*rchild;
 int c;
}Tree[32];
int loc;
int str1[32], str2[32];//分别存储后序遍历和中序遍历的字符串
Node *create(){
 Tree[loc].lchild = Tree[loc].rchild = NULL;
 return &Tree[loc++];
}
queue<Node *>Q;//用于层序遍历,用队列
Node *build(int s1, int e1, int s2, int e2){//利用递归来构建数
 Node *ret = create();
 ret->c = str1[e1];
 int rootIdx;
 for (int i = s2; i <= e2; i++){//由后续遍历找到根节点,然后找到其在中序的位置
  if (str2[i] == str1[e1]){
   rootIdx = i;
   break;
  }
 }
 if (rootIdx != s2){//然后进行左右子树的分隔
  ret->lchild = build(s1, s1 + rootIdx - s2 - 1, s2, rootIdx - 1);
 }
 if (rootIdx != e2){
  ret->rchild = build(s1 + rootIdx - s2, e1 - 1, rootIdx + 1, e2);
 }
 return ret;
}
int main(void){
 //freopen("F://Temp/input.txt", "r", stdin);
 int n;
 while (scanf("%d", &n) != EOF){
  for (int i = 0; i < n; i++){
   scanf("%d", &str1[i]);
  }
  for (int i = 0; i < n; i++){
   scanf("%d", &str2[i]);
  }
  loc = 0;
  Node *T = build(0, n - 1, 0, n - 1);
  Q.push(T);
  while (!Q.empty()){//用队列来层序遍历输出,把对头元素取出输出,并让左右节点(如果有)入队
   Node *tmp = Q.front();
   if (tmp -> lchild != NULL){
    Q.push(tmp->lchild);
   }
   if (tmp -> rchild != NULL){
    Q.push(tmp -> rchild);
   }
   Q.pop();
   if (Q.empty()){
    printf("%d\n", tmp -> c);
   }
   else printf("%d ", tmp -> c);
  }
 }
 return 0;
}


截图:

——Apie陈小旭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值