力扣HOT100 二叉树-从前序与中序遍历序列构造二叉树

递归法

前序遍历中第一个元素肯定是根节点。然后根据这个根节点 去中序遍历中找该元素。然后中序遍历中根的左边是左子树 右边是右子树。这样就知道了这个二叉树的左右子树。然后再根据左右子树的前序遍历、中序遍历同样的方法递归。(因为前序/中序遍历的左右子树仍然是前序/中序遍历)

vector中的区间是左闭右开。

vector<int> left_preorder(preorder.begin() + 1, preorder.begin() + index + 1);则是创建一个括号里左闭右开的区间的内容放到vector中。

cpp 复制代码
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        //先判断是否为空
        if(preorder.empty()){
            return nullptr;
        }
           TreeNode* root = new TreeNode(preorder[0]);
        //找一下中序遍历中的根节点的索引
        int index  = 0;
        //前序遍历的第一元素是根
        int root1 = preorder[0];
        for(int i =0;i<inorder.size();i++){
            if(inorder[i] == root1){
                index = i;
            }
        }

        //确定左子树的前序遍历和中序遍历
        vector<int> left_pre(preorder.begin()+1,preorder.begin()+index+1);
        vector<int> left_inorder(inorder.begin(),inorder.begin()+index);
       root->left =  buildTree(left_pre,left_inorder);
        vector<int> right_pre(preorder.begin()+index+1,preorder.end());
        vector<int> right_inorder(inorder.begin()+index+1,inorder.end());
       root->right =  buildTree(right_pre,right_inorder);

        return root;


        
    }
};