码迷,mamicode.com
首页 > 其他好文 > 详细

重建二叉树

时间:2015-05-07 22:07:00      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:二叉树

二叉树的结点表示:

struct NODE

{

    NODE* pLeft;

   NODE* pRight;

   char chValue;

};

假设已经有了前序和中序遍历结果,希望通过一个算法重建这颗树。

技术分享


技术分享

分析:

技术分享

//Rebuild.cpp :根据前序及中序结果,重建树的根节点
//定义树的长度,为了后序调用实现的简单,直接用宏定义了树节点的总数
#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;
pTemp->chValue = *pPreOrder;
pTemp->pLeft = NULL;
PTemp->pRight = NULL;


//如果节点为空,把当前节点复制到根节点
if (*pRoot == NULL)
*pRoot = pTemp;
//如果当前树的长度为1,那么已经是最后一个节点了
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++;
}
//寻找左子树的长度
int nLeftLen = 0;
nLeftLen = (int)(pLeftEnd - pOrgInOrder);
//寻找右子树长度
int nRightLen = 0;
nRightLen = nTreeLen - nLeftLen - 1;
//重建左子树
if (nLeftLen > 0)
ReBuild(pPreOrder + 1, pInOrder, nLeftLen, &((*pRoot)->pLeft));
//重建右子树
if (nRightLen > 0)
   ReBuild(pPreOrder +nLeftLen+1, pInOrder+nLeftLen+1, nRightLen, &((*pRoot)->pRight));
}
//示例调用代码

int main(int argc, char* argv[])
{
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);
}


重建二叉树

标签:二叉树

原文地址:http://blog.csdn.net/wangfengfan1/article/details/45541939

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!