범위값계산
preorder의 index / inorder의 범위가 필요하다.
preorder index는 루트를 나타낸다. 해당 인덱스값을 inorder에 대입하면 왼쪽 서브트리와 오른쪽 서브트리로 나눌수있다. 각각의 범위 계산을 잘해야한다.
preorder의 index는 왼쪽서브트리의 경우 root index + 1 (다음값이 무조건 왼쪽서브트리의 루트)
오른쪽서브트리의 경우 root index + 1 + 왼쪽서브트리의 크기(inorder에서 구할수있다.)
inorder의 범위는 왼쪽 서브트리의 경우 [begin , root index-1]
오른쪽서브트리의 경우 [root index +1 , end] 이다.
/**
* 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);
}
};