LeetCode 1008. Construct Binary Search Tree from Preorder Traversal
2020-05-24 21:33:27 # leetcode

Problem

LeetCode 1008. Construct Binary Search Tree from Preorder Traversal

1. 题目简述

给出一棵BST树的前序遍历的顺序,恢复这棵树。例如:

Input: [8,5,1,7,10,12]
Output: [8,5,10,1,7,null,12]

BST树

Constraints:

1 <= preorder.length <= 100
1 <= preorder[i] <= 10^8
The values of preorder are distinct.

2. 算法思路

中序遍历+前序遍历

这道题和LeetCode 105很像,只不过105中给出的是一棵二叉树的前序和中序遍历,对于BST树来说,其中序遍历就是其所有元素从小到大的排列。

第一种做法更加简洁一些。中序遍历的顺序是”中->左子树->右子树”,也就是说从第二个元素开始,到左子树结束,其中间的数都比“中”要小,所以并不需要通过中序遍历找左右子树。

第二种做法就是重排列一下数组,然后以前序遍历和中序遍历的顺序重新construct整棵树。这种做法麻烦的地方在于需要注意很多index,一不小心就会出很大的错。

3. 解法

  1. 简洁版,不找中序遍历序列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

/**
* 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 bstFromPreorder(int[] preorder) {
return buildTree(preorder, 0, preorder.length - 1);
}

private TreeNode buildTree(int[] preorder, int start, int end) {
if (start > end) {
return null;
}

int temp = end;
while (preorder[temp] > preorder[start]) {
temp--;
}

TreeNode node = new TreeNode(preorder[start]);
node.left = buildTree(preorder, start + 1, temp);
node.right = buildTree(preorder, temp + 1, end);

return node;
}
}
  1. 麻烦版本(代码见LeetCode 105