题目

> 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路

> 这题一般用递归的方法来解,根据先序遍历和中序遍历很容易的确定头节点,但左子叶和右子叶无法判定,但是我们可以确定左子树的先序遍历中序遍历和右子树的先序遍历中序遍历结果,提取后再次调用函数即可重建二叉树。

代码

class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) {
        if(vin.size() == 0)
            return NULL;
        TreeNode *node = new TreeNode(pre[0]);
        int index = 0;
        for(int i = 0; i < vin.size(); i++)
        {
            if (vin[i] == pre[0])
                index = i;
        }
        vector<int> lpre, lvin, rpre, rvin;
        for(int j = 0; j < index; j++)
        {
            lpre.push_back(pre[j+1]);
            lvin.push_back(vin[j]);
        }
        for(int k = 0; k < (vin.size() - index - 1); k++)
        {
            rpre.push_back(pre[index + k + 1]);
            rvin.push_back(vin[index + 1 + k]);
        }
        node->left = reConstructBinaryTree(lpre, lvin);
        node->right = reConstructBinaryTree(rpre, rvin);
        return node;
    }

};