All Articles

[Leetcode] Construct Binary Tree from Preorder and Inorder Traversal

문제

Given preorder and inorder traversal of a tree, construct the binary tree. Leetcode

코드

struct TreeNode {
  int val;
  TreeNode *left;
  TreeNode *right;
  TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
  if (preorder.size() == 0) return NULL;

  TreeNode* root = new TreeNode(preorder[0]);
  int root_idx;
  for (int i = 0; i < inorder.size(); i++) {
    if (inorder[i] == root->val) {
      root_idx = i;
      break;
    }
  }

  if (root_idx != 0) {
    vector<int> new_preorder(preorder.begin() + 1, preorder.begin() + root_idx + 1);
    vector<int> new_inorder(inorder.begin(), inorder.begin() + root_idx);
    root->left = buildTree(new_preorder, new_inorder);
  }

  if (root_idx != inorder.size() - 1) {
    vector<int> new_preorder(preorder.begin() + 1 + root_idx, preorder.end());
    vector<int> new_inorder(inorder.begin() + root_idx + 1, inorder.end());
    root->right = buildTree(new_preorder, new_inorder);
  }

  return root;
}

풀이

전위 순회에서 맨 첫번째 값은 무조건 루트다. 루트 값을 알 수 있으니 중위 순회한 결과에서 루트를 찾는다면 그 값을 기준으로 0번째 값부터 왼쪽은 루트의 왼쪽이 되고, 오른쪽 부터 끝까지는 루트의 오른쪽이 된다. 전위 순회값에서도 이를 이용하여 중위 순회에서 찾은 왼쪽을 이루는 것들의 개수만큼을 왼쪽 범위로 넘겨주고 나머지는 오른쪽으로 넘겨준다.