浙大 PAT Advanced level 1020. Tree Traversals (25)

来源:互联网 发布:赢时胜软件 编辑:程序博客网 时间:2024/06/04 18:33
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 <iostream>#include <queue>using namespace std;typedef struct node{int data;struct node *lchild;struct node *rchild;}node;#define MAXLENGTH 32#if 0void preOrderTraverse(node *root){if (root){cout << root->data << ' ';preOrderTraverse(root->lchild);preOrderTraverse(root->lchild);}}void inOrderTraverse(node *root){if (root){inOrderTraverse(root->lchild);cout << root->data << ' ';inOrderTraverse(root->rchild);}}void postOrderTraverse(node *root){if (root){postOrderTraverse(root->lchild);postOrderTraverse(root->rchild);cout << root->data << ' ';}}#endif void levelOrderTraverse(node *root){queue<node *> Q;node *temp;bool flag = false;if (root){Q.push(root);while (!Q.empty()){temp = Q.front();Q.pop();if (flag){cout << ' ';}else{flag = true;}cout << temp->data;if (temp->lchild){Q.push(temp->lchild);}if (temp->rchild){Q.push(temp->rchild);}}}}bool inPostOrderRestore(int *postOrder, int *inOrder, int num, node *root){int index = 0;root->data = postOrder[num-1];while (index != num){if (inOrder[index] == postOrder[num-1]){break;}++index;}// 未找到相同项,输入数据有问题if (num == index){return false;}// 左子树不为空if (0 != index){root->lchild = new node;root->lchild->lchild = NULL;root->lchild->rchild = NULL;inPostOrderRestore(postOrder, inOrder, index, root->lchild);}// 右子树不为空if (index != num-1){root->rchild = new node;root->rchild->lchild = NULL;root->rchild->rchild = NULL;// 调整位置for (int i = index; i != num-1; ++i){inOrder[i] = inOrder[i+1];}inPostOrderRestore(postOrder+index, inOrder+index, num-index-1, root->rchild);}return true;}int main(){int num;node *root;int postOrder[MAXLENGTH];int inOrder[MAXLENGTH];cin >> num;root = new node;root->lchild = NULL;root->rchild = NULL;for (int i = 0; i != num; ++i){cin >> postOrder[i];}for (int i = 0; i != num; ++i){cin >> inOrder[i];}inPostOrderRestore(postOrder, inOrder, num, root);levelOrderTraverse(root);cout << endl;system("pause");return 0;}


0 0
原创粉丝点击