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;
}
}