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: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 <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 subtree
root->element = postorder[postorderIndex + length - 1];
//find root in inorder sequence
int 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 leftSubTree
root->leftChild = binaryTree(postorderIndex, inorderIndex, leftLength);
//find rightSubTree
root->rightChild = binaryTree(postorderIndex + leftLength, indexOfRoot + 1, rightLength);
//recall
return 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 number
else {
cout << index->element;
firstOut = false;
}
que.pop();
}
}