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

2014-11-23 23:12:01 · 作者: · 浏览: 4
#include
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<chValue<<" "; PrePrint(pRoot->pLeft); PrePrint(pRoot->pRight); } //中序遍历结果 void InPrint(NODE* pRoot) { if(pRoot == NULL) { return; } InPrint(pRoot->pLeft); cout<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<