算法如下:
1)先在先序序列中找到根结点,
2)在中序序列中找到根结点位置,(可以将二叉树分为左子树和右子树)
3)用同样的办法构造左子树
4)用同样的办法构造右子树。
//根据先序序列与中序序列构建二叉树
BinaryTree* Pre_In_Build(char* pre ,char* in, int size){
if(!pre || !in || size < 0){
cout<<"输入出错!"<<endl;
return NULL;
}
int root_index = 0;
//寻找根结点
for(root_index = 0 ; root_index < size ; root_index++){
if(in[root_index] == pre[0]){
break;
}else{
continue;
}
}
if(root_index == size){
cout<<"先序序列与中序序列不匹配!"<<endl;
return NULL;
}
//创建根结点
BinaryTree* root = this->Creat_Node(pre[0]);
//递归构建左子树
if(root_index > 0){
root->lchild = this->Pre_In_Build(pre+1,in,root_index);
}
//递归构建右子树
if(size - root_index - 1 > 0){
root->rchild = this->Pre_In_Build(pre+root_index+1,in+1+root_index,size-root_index-1);
}
return root;
}
void set(char ch){
this->data = ch;
this->lchild = this->rchild = NULL;
}
//创建根节点的函数
BinaryTree* Creat_Node(char ch){
BinaryTree* root;
root = new BinaryTree;
root->set(ch);
return root;
}
对于二叉树的遍历算法可以详见我的另一篇博客:
http://blog.csdn.net/qq_30091945/article/details/77531651