105. 从前序与中序遍历序列构造二叉树

今天依然是二叉树,怀疑人生的一天,会画二叉树,但是用代码就不会,感叹智商

看了很多遍题解这才终于搞明白,以后画图预演一定好好总结规律再写代码


class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        TreeNode* root ;
        root = build(preorder,inorder,0,inorder.size()-1,0,inorder.size()-1);
        return root;
    }
    // pre_left和pre_right是当前子二叉树在前序遍历中的位置
    TreeNode* build(vector<int>& preorder,vector<int>& inorder,int left,int right,int pre_left,int pre_right){
        int inorder_root = left;
        int i;
      //下面题解使用的是map,大大缩短时间
        for(i = left; i<=right; i++){
            if(inorder[i] == preorder[pre_left]){
                inorder_root = i;
                break;
            }
        } 
        if(left>right){
            return nullptr;
        }      
        TreeNode* root = new TreeNode();
        root->val=preorder[pre_left];
      
        root->left=build(preorder,inorder,left,inorder_root-1,pre_left+1,pre_left+inorder_root-left);
        root->right=build(preorder,inorder,inorder_root+1,right,pre_left+inorder_root-left+1,pre_right);
        return root;
    }
};

posted @ 2021-12-11 14:03  jozon  阅读(24)  评论(0)    收藏  举报