目录
原题
思路
后序遍历中的末元素,其在中序遍历序列中的位置的左边的元素是该元素的左子树的成员元素,右边的元素是该元素的右子树的成员元素。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <vector>
struct node{
int key;
node *left, *right;
};
using namespace std;
int *postorder, *inorder, num;
node *reconstruct(int p_left, int p_right, int i_left, int i_right);
int findkey(int index);
int main(int argc, const char * argv[]) {
scanf("%d", &num);
postorder = (int *)calloc(num, sizeof(int));
inorder = (int *)calloc(num, sizeof(int));
for(int i = 0; i < num; i++){
scanf("%d", postorder + i);
}
for(int i = 0; i < num; i++){
scanf("%d", inorder + i);
}
node *root = reconstruct(0, num - 1, 0, num - 1);
queue<node *> que;
vector<int> array;
que.push(root);
while(!que.empty()){
node *temp = que.front();
array.push_back(temp->key);
que.pop();
if(temp->left){
que.push(temp->left);
}
if(temp->right){
que.push(temp->right);
}
}
printf("%d", array[0]);
for(int i = 1; i < array.size(); i++){
printf(" %d", array[i]);
}
putchar('\n');
return 0;
}
node *reconstruct(int p_left, int p_right, int i_left, int i_right){
if(p_left > p_right){
return nullptr;
}
int i = i_left;
while(postorder[p_right] != inorder[i]){
i++;
}
node *root = (node *)calloc(1, sizeof(node));
root->key = postorder[p_right];
root->left = reconstruct(p_left, p_left + i - i_left - 1, i_left, i - 1);
root->right = reconstruct(p_left + i - i_left, p_right - 1, i + 1, i_right);
return root;
}