1008. 前序遍历构造二叉搜索树

返回与给定前序遍历 preorder 相匹配的二叉搜索树(binary search tree)的根结点。

(回想一下,二叉搜索树是二叉树的一种,其每个节点都满足以下规则,对于 node.left 的任何后代,值总 < node.val,而 node.right 的任何后代,值总 > node.val。此外,前序遍历首先显示节点 node 的值,然后遍历 node.left,接着遍历 node.right。)

题目保证,对于给定的测试用例,总能找到满足要求的二叉搜索树。

链接

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
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/

function bstFromPreorder(preorder: number[]): TreeNode | null {
if (preorder.length === 0) return null
function traverse(preorder: number[], startIndex: number, endIndex: number) {
if (startIndex > endIndex) return null
const node = new TreeNode(preorder[startIndex])
let leftEndIndex = startIndex + 1
for(; leftEndIndex <= endIndex; leftEndIndex++) {
if (preorder[startIndex] < preorder[leftEndIndex]) break
}
node.left = traverse(preorder, startIndex + 1, leftEndIndex - 1)
node.right = traverse(preorder, leftEndIndex, endIndex)
return node
}
return traverse(preorder, 0, preorder.length - 1)
};