Try   HackMD

【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]

Example 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

Solution

  • 關於何謂二元樹、前序、中序若不懂的人可以參考我的資料結構筆記
  • 本題的解題思路主要是利用遞迴,將每個節點都當作是子問題去解決。
  • 由前序可以知道哪個節點在上面(越前面的越上面)、而中序可以知道哪個節點靠左(越前面的越左邊)
  • 因此我們可以知道前序的第一個元素一定是 root 的值,且該元素對應到中序後,左邊的值就在左邊,右邊的值就在右邊。
  • 接著就將 left 和 right 分別當作新的 root node 下去做即可。
  • 遞迴的中止條件是在 inorder 中找不到對應元素

Code

/** * 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++