[leetcode] Construct Binary Tree from Preorder and Inorder Traversal

jun·2021년 4월 7일
0
post-thumbnail

유의할점

범위값계산

풀이

preorder의 index / inorder의 범위가 필요하다.

preorder index는 루트를 나타낸다. 해당 인덱스값을 inorder에 대입하면 왼쪽 서브트리와 오른쪽 서브트리로 나눌수있다. 각각의 범위 계산을 잘해야한다.

preorder의 index는 왼쪽서브트리의 경우 root index + 1 (다음값이 무조건 왼쪽서브트리의 루트)

오른쪽서브트리의 경우 root index + 1 + 왼쪽서브트리의 크기(inorder에서 구할수있다.)

inorder의 범위는 왼쪽 서브트리의 경우 [begin , root index-1]

오른쪽서브트리의 경우 [root index +1 , end] 이다.

코드

C++


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* build(int rootIdx, int inbegin, int inend, vector<int>& preorder, vector<int>& inorder) {
        TreeNode* root = NULL;
        if (inbegin <= inend&&rootIdx<preorder.size()) {
            int rootVal = preorder[rootIdx];
            int i = find(inorder.begin() + inbegin, inorder.begin() + inend, rootVal) - inorder.begin();
            
            root = new TreeNode(rootVal);
            root->left = build(rootIdx + 1, 
                               inbegin, i - 1, preorder, inorder);
            root->right = build(rootIdx + 1 + i - inbegin, 
                                i + 1, inend, preorder, inorder);
        }
        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return build(0, 0, inorder.size() - 1, preorder, inorder);
    }
};
profile
Computer Science / Algorithm / Project / TIL

0개의 댓글