重建二叉树

来源:互联网 发布:流动人口定时联系软件 编辑:程序博客网 时间:2024/04/27 14:28

编程之美上面的 重建二叉树 实现代码

#include<stdio.h>#include<malloc.h>#define TREELEN 6struct NODE{    NODE *pLeft;    NODE *pRight;    char chValue;};void ReBuild(char *pPreOrder, char *pInOrder,int nTreeLen, NODE **pRoot){    //检查边界条件    if(pPreOrder ==NULL || pInOrder ==NULL)    {        return ;    }    //获得前序遍历的第一个节点    NODE * pTemp = new NODE;    //NODE *pTemp;    //if(!(pTemp = (Node *)malloc(sizeof(Node))))  return;    pTemp->chValue = *pPreOrder;    pTemp->pLeft = NULL;    pTemp->pRight = NULL;    if(*pRoot == NULL)    {        *pRoot = pTemp;    }    if(nTreeLen ==1)    {        return ;    }    char *pOrgInOrder = pInOrder;    char *pLeftEnd = pInOrder;    int nTempLen = 0;    //找到左子树的结尾    while(*pPreOrder != *pLeftEnd)    {        if(pPreOrder ==NULL || pLeftEnd ==NULL)        {            return ;        }        nTempLen ++;        if(nTempLen > nTreeLen)        {            break;        }        pLeftEnd++;    }    //leftchild Tree length    int nLeftLen =0;    nLeftLen = int(pLeftEnd - pOrgInOrder);    //rightchild Tree length    int nRightLen =0;    nRightLen = nTreeLen - nLeftLen -1;    //reCreate leftchild Tree    if(nLeftLen >0)    {        ReBuild(pPreOrder +1, pInOrder, nLeftLen, &((*pRoot)->pLeft));    }    //reCreate rightchild Tree    if(nRightLen >0)    {        ReBuild(pPreOrder+nLeftLen +1,pOrgInOrder + nLeftLen +1,nRightLen, &((*pRoot)->pRight));    }}void PostOrder(NODE *pRoot){    if(pRoot)    {        PostOrder(pRoot->pLeft);        PostOrder(pRoot->pRight);        printf("%c",pRoot->chValue);    }}int main(){    char szPreOrder[TREELEN] = {'a','b','d','c','e','f'};    char szInOrder[TREELEN] = {'d','b','a','e','c','f'};    NODE * pRoot = NULL;    ReBuild(szPreOrder, szInOrder,TREELEN,&pRoot);    PostOrder(pRoot);    printf("\nok!");    return 0;}


0 0