#include "stdafx.h"
#include <iostream>
#include <exception>
#include <stack>
using namespace std;
/*
重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.
假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如
输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},
则重建出图所示的二叉树并输出它的头结点。二叉树结点的定义如下:
*/
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_PRight;
};
BinaryTreeNode* ConstructConre(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
{
int rootValue = startPreorder[0];
BinaryTreeNode* root = new BinaryTreeNode();
root->m_nValue = rootValue;
root->m_pLeft = root->m_PRight = NULL;
if(startPreorder == endPreorder)
{
if(startInorder == endInorder && *startPreorder ==*startInorder)
return root;
else
throw std::exception("invalid input");
}
//在中序遍历中找到根结点的值
int* rootInorder = startInorder;
while(rootInorder <= endInorder&& *rootInorder !=rootValue)
++ rootInorder;
if(rootInorder ==endInorder && *rootInorder != rootValue)
throw std::exception("Invalid input.");
int leftLength = rootInorder - startInorder;
int *leftPreorderEnd = startPreorder +leftLength;
if(leftLength >0)
{
//构建左子树
root->m_pLeft = ConstructConre(startPreorder+1,leftPreorderEnd,startInorder,rootInorder -1);
}
if(leftLength<endPreorder - startPreorder)
{
//构建右子树
root->m_PRight = ConstructConre(leftPreorderEnd +1,endPreorder,rootInorder+1,endInorder);
}
return root;
}
BinaryTreeNode* Construct(int *preOrder,int* inOrder,int length)
{
if(preOrder==NULL||inOrder==NULL||length<=0)
{
return NULL;
}
return ConstructConre(preOrder,preOrder+length-1,inOrder,inOrder+length-1);
}
int _tmain(int argc, _TCHAR* argv[])
{
return 0 ;
}
备注:本文为转载,思路比较清晰,原文地址http://www.cnblogs.com/crazycodehzp/p/3556863.html
根据前序和中序遍历重建二叉树
最新推荐文章于 2021-12-01 17:22:49 发布