牛客网剑指offer-重建二叉树

题目描述

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


/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector &pre,vector &vin) {
        return getRoot(pre, vin, 0, pre.size()-1, 0, vin.size()-1);
    }
    //prestart,preend用来表示当前检查的前序遍历序列的范围,vinstart,vinend用来表示当前检查的中序遍历序列的范围
    TreeNode* getRoot(vector &pre, vector &vin, int prestart, int preend, int vinstart, int vinend)
    {
        if(prestart > preend || vinstart > vinend)
            return nullptr;
        //前序遍历的第一个节点一定是根节点,中序遍历中根节点的位置会把左右子树分开,利用这些特点进行递归就能解决问题了
        for(int i=vinstart; i<=vinend; ++i)
        {
            //在中序遍历序列中找到根节点
            if(vin[i] == pre[prestart])
            {
                TreeNode* node = new TreeNode(vin[i]);
                //(i-vinstart)表示左子树的节点数
                node->left = getRoot(pre, vin, prestart+1, prestart+(i-vinstart), vinstart, i-1);
                node->right = getRoot(pre, vin, prestart+(i-vinstart)+1, preend, i+1, vinend);
                return node;
            }
        }
        return nullptr;
    }
};

你可能感兴趣的:(剑指offer)