#include "stdafx.h"#include "Utilities/BinaryTree.h"#includeBinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder);BinaryTreeNode* Construct(int* preorder, int* inorder, int length) { if(preorder == NULL || inorder == NULL || length <= 0) return NULL; return ConstructCore(preorder, preorder+length-1, inorder, inorder+length-1);}BinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder) { int rootValue = *startPreorder; BinaryTreeNode* root = new BinaryTreeNode(); root->m_nValue = rootValue; root->m_pLeft = root->m_pRight = NULL; //left only one node if((startPreorder == endPreorder) && (startInorder == endInorder)) { if(*startPreorder == *startInorder) return root; else throw std::exception(); } //find root node in inorder int* rootInorder = startInorder; while(rootInorder <= endInorder && *rootInorder != rootValue) ++rootInorder; if(rootInorder == endInorder && *rootInorder != rootValue) { throw std::exception(); } int leftLength = rootInorder - startInorder; int* leftEndPreorder = startPreorder + leftLength; //left subtree if(leftLength > 0) { root->m_pLeft = ConstructCore(startPreorder+1, leftEndPreorder, startInorder, rootInorder-1); } //right subtree if(0 < endInorder - rootInorder) { root->m_pRight = ConstructCore(leftEndPreorder+1, endPreorder, rootInorder+1, endInorder); } return root;}//=====================================Test====================================void Test(const char* testName, int* preorder, int* inorder, int length) { if(testName != NULL) printf("%s begins:\n", testName); printf("The preorder sequence is: "); for(int i=0; i