105. Construct Binary Tree from Preorder and Inorder Traversal

https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

Problem

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

Note: You may assume that duplicates do not exist in the tree.

For example, given

preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]

Return the following binary tree:

    3
   / \
  9  20
    /  \
   15   7

Solution

/**
 * 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* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return buildTree(preorder, inorder, 0, 0, preorder.size());
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int preroot, int inroot, int size) {
        if (size <= 0) return nullptr;
        const auto root = new TreeNode(preorder[preroot]);
        if (size == 1) return root;
        const auto center = search(inorder, inroot, inroot + size, root->val);
        const auto leftsize = center - inroot;
        root->left = buildTree(preorder, inorder, preroot + 1, inroot, leftsize);
        root->right = buildTree(preorder, inorder, preroot + 1 + leftsize, center + 1, size - leftsize - 1);
        return root;
    }
    inline int search(vector<int> &nums, int start, int end, int target) {
        for (int i = start; i < end; ++i) {
            if (nums[i] == target) return i;
        }
        return -1;
    }
}; 
  • #recursion

  • #tree

  • #veryimportant

Last updated

Was this helpful?