# 【LeetCode】 105. Construct Binary Tree from Preorder and Inorder Traversal ## Description > Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same tree, construct and return the binary tree. > 給兩個整數數列前序和中序,分別是對同一棵二元樹的前序遍歷和中序遍歷,請根據前序和中序建立並回傳這棵二元樹。 ## Example: ``` Example 1: Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7] ``` ![](https://assets.leetcode.com/uploads/2021/02/19/tree.jpg) ``` Example 2: Input: preorder = [-1], inorder = [-1] Output: [-1] ``` ## Solution * 關於何謂二元樹、前序、中序若不懂的人可以參考我的[資料結構筆記](https://hackmd.io/@Zero871015/DSNote)。 * 本題的解題思路主要是利用遞迴,將每個節點都當作是子問題去解決。 * 由前序可以知道哪個節點在上面(越前面的越上面)、而中序可以知道哪個節點靠左(越前面的越左邊) * 因此我們可以知道前序的第一個元素一定是 root 的值,且該元素對應到中序後,左邊的值就在左邊,右邊的值就在右邊。 * ![](https://i.imgur.com/Ig8QnXG.png) * 接著就將 left 和 right 分別當作新的 root node 下去做即可。 * 遞迴的中止條件是在 inorder 中找不到對應元素 ### Code ```C++=1 /** * 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) { TreeNode* node = new TreeNode(); node = buildSubTree(preorder, inorder); return node; } TreeNode* buildSubTree(vector<int>& preorder, vector<int>& inorder) { std::vector<int>::iterator it; it = find(inorder.begin(), inorder.end(), preorder.front()); if(it == inorder.end()) return NULL; TreeNode* node = new TreeNode(); vector<int> leftInorder(inorder.begin(), it); vector<int> rightInorder(it + 1, inorder.end()); node->val = preorder.front(); preorder.erase(preorder.begin()); node->left = buildSubTree(preorder, leftInorder); node->right = buildSubTree(preorder, rightInorder); return node; } }; ``` ###### tags: `LeetCode` `C++`