0105. Construct Binary Tree from Preorder and Inorder Traversal - kumaeki/LeetCode GitHub Wiki

0105. Construct Binary Tree from Preorder and Inorder Traversal


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

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.

解法1

用前序排列和中序排列的性质来求解. 前序排列 : 顶点总是出现在第一个. 中序排列 : 顶点的左节点及其子节点总是出现在数组中对应的左侧,(右侧同理).

/**
 * 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;
 *     }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int n = preorder.length;
        return helper(preorder, inorder, 0, n - 1, 0, n - 1);
    }

    private TreeNode helper(int[] preorder, int[] inorder, int preLeft, int preRight, int inLeft, int inRight) {
        if (preLeft > preRight)
            return null;

        TreeNode node = new TreeNode(preorder[preLeft]);

        if (preLeft == preRight)
            return node;
        
        // 这里也可以用HashMap来加快速度
        int index = inLeft;
        while (index <= inRight) {
            if (inorder[index] == preorder[preLeft])
                break;
            else
                index++;
        }
        int preLeftNew = preLeft + (index - inLeft);

        node.left = helper(preorder, inorder, preLeft + 1, preLeftNew, inLeft, index - 1);
        node.right = helper(preorder, inorder, preLeftNew + 1, preRight, index + 1, inRight);
        return node;
    }
}