/*
名称:已知先序序列、中序序列创建二叉树
说明:这里主要用的是递归的算法。每次函数参数传递的
主要是树的根节点和树在先序和中序序列中的元素。最后
递归的结束条件是,要建立的子树长度为零,即子树 为空。
*/
int NodeNum; //结点的个数
//查找根结点在mid中的位置
int Findroot(int mid[],int root)
{
int i;
for( i = 0;mid[i] != root;++i) ; //查找时尽量不要用以前的老方法,这里是用了类似于“哨兵的”查找方法,省去了每次判断的步骤
return i;
}
/*根据中序遍历和先序遍历创建二叉树 (pre是先序遍历顺序,mid是中序遍历顺序,beg1、end1
是在先序遍历中的树的开始结点和结束结点,beg2和end2是中序遍历中树的开始结点和结束结点*/
void CreateTreeByMidPre(BiTree &T, int pre[],int mid[],int beg1,int end1,int beg2,int end2)
{
T = new BiTNode;
T->data = pre[beg1]; //根结点
int root_index = Findroot(mid,T->data); //找出根结点在中序遍历中的位置
int lchild_len = root_index - beg2; //左子树长度
int rchild_len = end2 - root_index; //右子树长度
if(lchild_len > 0)
CreateTreeByMidPre(T->lchild,pre,mid,beg1+1,beg1+lchild_len,root_index-lchild_len,root_index-1);
else
T->lchild = NULL;
if(rchild_len > 0)
CreateTreeByMidPre(T->rchild,pre,mid,end1 - rchild_len+1,end1,root_index+1,root_index+rchild_len);
else
T->rchild = NULL;
return ;
}