[leetcode 문제 풀이 시리즈] Construct Binary Tree from Preorder and Inorder Traversal

1495 단어
--제목과 같은 이치
동시에 총괄적으로 말하자면, 만약에 앞의 반복과 뒤의 반복만 제시한다면, 우리는 이 두 갈래 나무를 확정할 수 없다. 왜냐하면 언제든지 앞의 반복과 뒤의 반복은 상반되기 때문이다.
우리는 이 두 갈래 나무의 구조를 판단할 길이 없다.
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    TreeNode * dfs(int in_left, int in_right, vector<int> & inorder,
            int pre_left, int pre_right, vector<int> & preorder){
                if(in_left > in_right)
                    return 0;
                TreeNode * ret = new TreeNode(preorder[pre_left]);
                for(int i = in_left; i <= in_right; ++ i)
                    if(inorder[i] == preorder[pre_left]){
                        ret->left = dfs(in_left, i - 1, inorder, pre_left + 1, pre_left + 1+ i - 1 - in_left, preorder);
                        ret->right = dfs(i + 1, in_right, inorder, pre_right - (in_right - i - 1), pre_right, preorder); 
                        return ret;
                    }
                return 0;
            }
public:
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(inorder.size() <= 0)
            return 0;
        return dfs(0, inorder.size() - 1, inorder, 0, preorder.size() - 1, preorder);
    }
};

좋은 웹페이지 즐겨찾기