04-1 还原二叉树

来源:互联网 发布:mac 外接显卡坞价格 编辑:程序博客网 时间:2024/06/05 11:54

给定一棵二叉树的先序遍历序列和中序遍历序列,要求二叉树的高度。

我们知道先序遍历的第一个结点必然是跟结点,可以在中序遍历中找到这个根结点的位置,于是就知道在中序遍历中,根结点左边的所有结点一定属于左子树,右边的所有结点一定属于右子树

求二叉树的高度。如果我们已经知道左,右子树的高度,那么树的高度就是左右子树的高度中大的加1.所以我们就可以通过递归来实现。

#include<stdio.h>#include<stdlib.h>#define MAXN 50//树的基本结构 typedef struct TreeNode *BinTree;struct TreeNode{    char Data;    BinTree Left;    BinTree Right;};BinTree CreateBinTree(char *Pre,char *In,int Len){    BinTree T;    int i;    if(!Len)        return NULL;    T = (BinTree)malloc(sizeof(struct TreeNode));    T->Data = Pre[0];    for(i=0;i<Len;i++)    {        if(Pre[0] == In[i])            break;    }    T->Left = CreateBinTree(Pre+1,In,i);    T->Right = CreateBinTree(Pre+i+1,In+i+1,Len-i-1);    return T; }//通过后序遍历求树高 int Height(BinTree T){    int THeight,LHeight,RHeight;    if(!T){        return THeight = 0;    }    else{        LHeight = Height(T->Left);        RHeight = Height(T->Right);        THeight = (LHeight>RHeight)?LHeight:RHeight;        THeight++;    }    return THeight;}int main(){    int N;    char Pre[MAXN+1],In[MAXN+1];    BinTree T = NULL;    scanf("%d",&N);    scanf("%s\n%s",Pre,In);    T = CreateBinTree(Pre,In,N);    printf("%d\n",Height(T));    return 0;}
0 0