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
思路:
根据后序遍历和中序遍历对树进行还原,然后层序遍历输出结果。
- 后序遍历【左右根】找到根,中序遍历【左根右】划分出左右子树,然后可以递归求解,递归的参数就是后序遍历和中序遍历的左右边界,终止条件是左索引大于右索引。
- 通过中序遍历,确定的是左子树节点的数量,利用数量就可以在后序遍历中划分出左右子树。【不是节点具体是什么,也不是节点的顺序,是数量】,区间是左闭右闭的,注意加一减一的问题。
- 利用队列,从根节点对树进行遍历,每一个循环要做的事【取出队列中的头节点,然后头节点的子树入队】。
#include<cstdio> #include<iostream> #include<queue> using namespace std; const int maxn = 40; int post[maxn], in[maxn], level[maxn]; struct treeNode { int data; treeNode* lchild; treeNode* rchild; }; treeNode* solve(int postL, int postR, int inL, int inR) { if (postL > postR) return NULL; treeNode* root = new treeNode; root->data = post[postR]; int k; for (k = inL; k <= inR; k++) { if (in[k] == root->data) break; } int leftNumber = k - inL; //左子树,post的区间是[postL, postL + leftNumber - 1], in的区间是[inL, k - 1] root->lchild = solve(postL, postL + leftNumber - 1, inL, k - 1); //右子树,post的区间是[postL + leftNumer, postR - 1], in的区间是[k + 1, inR] root->rchild = solve(postL + leftNumber, postR - 1, k + 1, inR); return root; } int main() { int N; scanf("%d", &N); for (int i = 0; i < N; i++) scanf("%d", &post[i]); for (int i = 0; i < N; i++) scanf("%d", &in[i]); treeNode* root = solve(0, N - 1, 0, N - 1); queue<treeNode*> Q; Q.push(root); while (!Q.empty()) { treeNode* top = Q.front(); Q.pop(); if(top->data == root->data) printf("%d", top->data); else printf(" %d", top->data); if (top->lchild != NULL) Q.push(top->lchild); if (top->rchild!= NULL) Q.push(top->rchild); } return 0; }
PAT - 1020 Tree Traversals
最新推荐文章于 2020-04-09 23:01:18 发布