您的位置:首页 > 其它

已知前序和中序遍历恢复二叉树

2013-07-17 14:51 225 查看
[cpp] view
plaincopy

#include<iostream>

using namespace std;

#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));

}

}

//前序遍历结果

void PrePrint(NODE* pRoot)

{

if(pRoot == NULL)

{

return;

}

cout<<pRoot->chValue<<" ";

PrePrint(pRoot->pLeft);

PrePrint(pRoot->pRight);

}

//中序遍历结果

void InPrint(NODE* pRoot)

{

if(pRoot == NULL)

{

return;

}

InPrint(pRoot->pLeft);

cout<<pRoot->chValue<<" ";

InPrint(pRoot->pRight);

}

void 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);

PrePrint(pRoot);

cout<<endl<<endl;;

InPrint(pRoot);

cout<<endl;

}

/*

a b d c e f

d b a e c f

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐