您的位置:首页 > 其它

重建二叉树

2014-09-04 10:33 253 查看
编程之美上面的 重建二叉树 实现代码

#include<stdio.h>
#include<malloc.h>

#define TREELEN 6

struct 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: