Tree Traversals

来源:互联网 发布:矩阵的逆 编辑:程序博客网 时间:2024/05/20 20:21

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 (<=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:
72 3 1 5 7 6 41 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2

本题是根据后序和中序求二叉树的问题,解题思路如下:

后序数列的最后一个数字是该树的根。

在中序数列中找到根的位置,那么根的左边就是左子树,右边是其右子树

递归调用左子树和右子树,直到数列长度为零

再用广度搜索的方法遍历该二叉树

#include <iostream>#include <vector>#include <queue>using namespace std;struct Node {Node* leftChild;Node* rightChild;int element;};Node* binaryTree(int postorderIndex,int inorderIndex,int length);void printTree(Node* root);vector<int> postorder, inorder;int main() {int n;cin >> n;postorder.resize(n);inorder.resize(n);for (int i = 0;i < n;i++)cin >> postorder[i];for (int i = 0;i < n;i++)cin >> inorder[i];Node *tree = binaryTree(0, 0, n);printTree(tree);system("pause");return 0;}Node* binaryTree(int postorderIndex, int inorderIndex, int length){if (length == 0)return NULL;Node *root = (Node*)malloc(sizeof(Node));//the last number of post order is the root of the subtreeroot->element = postorder[postorderIndex + length - 1];//find  root in inorder sequenceint indexOfRoot, leftLength, rightLength;for(int i =0;i<length;i++){if (inorder[inorderIndex+i] == root->element) {indexOfRoot = inorderIndex + i;leftLength = i;rightLength = length - leftLength - 1;break;}}//find leftSubTreeroot->leftChild = binaryTree(postorderIndex, inorderIndex, leftLength);//find rightSubTreeroot->rightChild = binaryTree(postorderIndex + leftLength, indexOfRoot + 1, rightLength);//recallreturn root;}void printTree(Node* root) {queue<Node*> que;que.push(root);Node* index;bool firstOut = true;while (!que.empty()) {index = que.front();if (index->leftChild != NULL)que.push(index->leftChild);if (index->rightChild != NULL)que.push(index->rightChild);if (!firstOut)cout << ' ' << index->element;//there are no space in front of the first numberelse {cout << index->element;firstOut = false;}que.pop();}}


0 0