程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 已知前序和中序遍歷恢復二叉樹

已知前序和中序遍歷恢復二叉樹

編輯:C++入門知識

#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
*/

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved