Skip to content

java-leetcode-classroom/java_build_binary_tree_from_preorder_inorder

Repository files navigation

java_build_binary_tree_from_preOrder_inOrder

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.

Examples

Example 1:

https://assets.leetcode.com/uploads/2021/02/19/tree.jpg

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]

Constraints:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • 3000 <= preorder[i], inorder[i] <= 3000
  • preorder and inorder consist of unique values.
  • Each value of inorder also appears in preorder.
  • preorder is guaranteed to be the preorder traversal of the tree.
  • inorder is guaranteed to be the inorder traversal of the tree.

解析

題目以 Pre-Order Traversal 與 In-Order Traversal 給出兩個整數陣列

求實作一個演算法建立出這棵二元樹

Pre-Order Traversal 特性會有以下走訪順序如下:

二元樹root , root.Left 子樹, root.Right 子樹

In-Order Traversal 特性會有以下走訪順序如下:

root.Left 子樹, 二元樹root, root.Right 子樹

觀察下圖

可以發現

每個 pre-order的點先遇到的都是子樹的跟結點

透過 pre-order的點去找到在 in-order的位置剛好可以把左右子數分開

所以可以透過遞迴關係來建立二元樹

程式碼

class Solution {
  /**
   * Definition for a binary tree node.
   * public class TreeNode {
   *     int val;
   *     TreeNode left;
   *     TreeNode right;
   *     TreeNode() {}
   *     TreeNode(int val) { this.val = val; }
   *     TreeNode(int val, TreeNode left, TreeNode right) {
   *         this.val = val;
   *         this.left = left;
   *         this.right = right;
   *     }
   * }
   */
  int preorderIdx;
  public TreeNode buildTree(int[] preorder, int[] inorder) {
    preorderIdx = 0;
    HashMap<Integer, Integer> inorderIdxMap = new HashMap<>();
    for (int idx = 0; idx < inorder.length; idx++) {
      inorderIdxMap.put(inorder[idx], idx);
    }
    return arrayToTree(preorder, 0, preorder.length - 1, inorderIdxMap);
  }
  public TreeNode arrayToTree(int[] preorder, int left, int right, HashMap<Integer, Integer> inorderIdxMap) {
    if (left > right) {
      return null;
    }
    int rootValue = preorder[preorderIdx];
    preorderIdx++;
    TreeNode root = new TreeNode(rootValue);
    root.left = arrayToTree(preorder, left, inorderIdxMap.get(rootValue) - 1, inorderIdxMap);
    root.right = arrayToTree(preorder,inorderIdxMap.get(rootValue) + 1, right, inorderIdxMap);
    return root;
  }
}

困難點

  1. 看出 Pre-Order Traversal 與 In-Order Traversal 的特性
  2. 看出遞迴關係

Solve Point

  • Understand what problem need to solve
  • Analysis Complexity
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy