剑指Offer系列---(8)重建二叉树

来源:互联网 发布:ug8.0编程教程 编辑:程序博客网 时间:2024/05/21 06:31

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

0 0