这里注意首先根据前序遍历找出根,然后分割二叉树进行建树。一定要在纸上画一画,用k做为子树的大小,preL,preR,inL,inR等作为树的边界,再加上preL>preR的跳出条件,就能完成了。
#include <bits/stdc++.h>
using namespace std;
int pre[10] = {1,2,3,4,5,6};
int in[10] = {3,2,4,1,5,6};
typedef struct node{
int data;
struct node *left;
struct node *right;
}node;
//前+中 -> 后
node* createPost(int preL,int preR,int inL,int inR)
{
if(preL > preR) return NULL;
int k = inL;//k是左起点
for(;in[k]!=pre[preL];++k);
node* root = (node*)malloc(sizeof(node));
root->data = pre[preL];
//注意pre+k-inL,不是pre+k!
root->left = createPost(preL+1,preL+k-inL,inL,k-1);
root->right = createPost(preL+k-inL+1,preR,k+1,inR);
return root;
}
//后序遍历
void postTranv(node* root)
{
if(root == NULL) return;
postTranv(root->left);
postTranv(root->right);
cout << root->data;
}
int main()
{
node* root = createPost(0,5,0,5);
postTranv(root);
return 0;
}