由中序遍历序列和后续遍历序列恢复二叉树

在网上找了很多 发现都大多是前序和中序恢复树的 今天就写一个后序和中序恢复树的代码 其实很好理解

BinTree*  ReBuildTree(char * post, int i, int j, char * in, int m, int n)
{
    //post[i.....j] in[m....n]
    int x;  //x是遍历器
    BinTree* p;   //p是新的结点
    p = (BinTree*)malloc(sizeof(BinTree));
    p->data = *(post + j);      //从后序序列中读取结点信息

    x = m;

    for (; (*(in + x) != *(post + j)); x++);//在中序中找到根节点位置

    //接下来递归完成左右子树的构建

    //中序序列的第一个就是根节点,那么它没有左子树
    if (x == m) p->lchild = NULL;
    else
    {
        p->lchild = ReBuildTree(post, i, i+ x-m-1, in, m, x-1);
    }

    if (x == n) p->rchild = NULL;
    //中序序列的最后一个是根节点,那么它没有右子树
    else
    {
        p->rchild = ReBuildTree(post,i+x-m,j-1,in,x+1,n);
    }
    return p;//最后返回这个根节点
}

你可能感兴趣的:(算法)