近日,学习到二叉树遍历这块,书上只有中序+先序/后序的重构,网上关于中序+层序的重构也比较复杂。自己根据网上的进行修改简化,以此记录,同时给其他学习者一个参考。
#include <cstdio>
const int maxn = 10010;
struct Node
{
int x;
Node *left, *right;
};
int levelorder[maxn], inorder[maxn];
int n;
Node* buildtree(int il, int ir, int ll, int lr)
{
if(il>ir) return NULL;
Node* node = new Node;
int i, j;
for(j = ll; j <= lr; j++)
{
for(i = il; i <= ir; i++)
if(inorder[i] == levelorder[j])
break;
if(i<=ir) break;
}
node->x = inorder[i];
node->left = buildtree(il, i-1, j+1, lr);
node->right = buildtree(i+1, ir, j+1, lr);
return node;
}
void post(Node* root){
if(root==NULL) return;
post(root->left);
post(root->right);
printf("%d ",root->x);
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &inorder[i]);
for(int i = 0; i < n; i++) scanf("%d", &levelorder[i]);
Node* root = buildtree(0, n-1, 0, n-1);
post(root);
return 0;
}
例子
输入
7
1 2 3 4 5 6 7
4 1 6 3 5 7 2
输出
2 3 1 5 7 6 4