标签:二叉树
二叉树的结点表示:
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));
}
//示例调用代码
标签:二叉树
原文地址:http://blog.csdn.net/wangfengfan1/article/details/45541939