前序的第一个节点为根节点,根节点将中序序列一分为二。
小心处理前序和中序的开始和结束节点,递归生成二叉树。
下图中a为根节点,1位左子树,2为右子树,每次迭代需重新找到子树的位置。
#include
using namespace std;
typedef struct node
{
public:
node(char v)
{
val=v;
left=NULL;
right=NULL;
}
node* left;
node* right;
char val;
};
node* reBuild(char* pre,int ps,int pe,char* in,int is,int ie)
{
if(ps>pe or is>ie)return NULL;
char val=pre[0];//前序第一个元素,将中序一分为二
node *root=new node(val);
int mid=is;
while(mid
left = reBuild(pre+1,ps,mid-1,in,is,mid-1);
root->right = reBuild(pre+mid+1,ps,pe-mid-1,in+mid,is,ie-mid-1);
return root;
}
void visit(node* root)
{
if(root==NULL)return;
cout<
val<<" ";
visit(root->left);
visit(root->right);
}
int main()
{
char pre[6]={'a','b','d','c','e','f'};
char in[6]={'d','b','a','e','c','f'};
node* root;
root = reBuild(pre,0,5,in,0,5);
visit(root);
return 0;
}