1.题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果都不含重复的数字。例如输入前序遍历序列{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;
};
2.源代码:
// Copyright (c) 2015年 skewrain. All rights reserved.
#include <iostream>
#include <stdio.h>
using namespace std;
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
BinaryTreeNode* Construct(int* preorder,int* inorder,int length);
int main(int argc,char *argv[]){
int pre[8] = {1,2,4,7,3,5,6,8};
int in[8] = {4,7,2,1,5,3,8,6};
BinaryTreeNode *root = Construct(pre, in, 8);
printf("根结点的值为:%d\n",root->m_nValue);
return 0;
}
BinaryTreeNode* ConstructCore(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();
}
//在中序遍历中找到根节点的值
int* rootInorder = startInorder;
while (rootInorder <= endInorder && *rootInorder != rootValue) {
++rootInorder;
}
if(rootInorder == endInorder && *rootInorder != rootValue)
throw std::exception();
int leftLength = (int)(rootInorder - startInorder);
int* leftPreorderEnd = startPreorder + leftLength;
if(leftLength > 0)
{
//构建左子树
root->m_pLeft = ConstructCore(startPreorder+1, leftPreorderEnd, startInorder, rootInorder-1);
}
if(leftLength < endPreorder - startPreorder)
{
//构建右子树
root->m_pRight = ConstructCore(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 ConstructCore(preorder, preorder+length-1, inorder, inorder+length-1);
}