(C++)LeetCode#105. Construct Binary Tree from Preorder and Inorder Traversal

3081 ワード

  • 題:二叉木の前序と後序の遍歴結果に基づいて、二叉木
  • を再構築する
  • 難易度:Medium
  • 構想:前シーケンスの結果を遍歴し、ルートノードの中シーケンス遍歴中のindexを見つけ、左右のサブツリーを構築し続ける.【前系列区間と中系列区間を含む左右のサブツリーの要素が存在する区間を決定する】
  • コード:
  • /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
            map<int, int> m;
            if(preorder.empty()){
                return NULL;
            }
            int inlen = inorder.size();
            int prelen = preorder.size();
            if(inlen == 0 || prelen == 0 || inlen != prelen){
                return NULL;
            }
    
            return helper(preorder, 0, inlen-1, inorder, 0, inlen-1);
        }
    
        TreeNode* helper(vector<int>& preorder, int ps, int pe, vector<int>& inorder, int is, int ie){
            if(ps > pe || is > ie){
                return NULL;
            }
            TreeNode* root = new TreeNode(preorder[ps]);
            auto f = find(inorder.begin() + is, inorder.begin() + ie, preorder[ps]);
            //int ir = f - inorder.begin();     ok
            int ir = distance(inorder.begin(), f);
            root->left = helper(preorder, ps+1, ps+ir-is, inorder, is, ir-1);
            root->right = helper(preorder, ps+ir-is+1, pe, inorder, ir+1, ie);
            return root;
        }
    };