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