题目描述
返回与给定先序遍历 preorder 相匹配的二叉搜索树(binary search tree)的根结点。
(回想一下,二叉搜索树是二叉树的一种,其每个节点都满足以下规则,对于 node.left 的任何后代,值总 < node.val,而 node.right 的任何后代,值总 > node.val。此外,先序遍历首先显示节点的值,然后遍历 node.left,接着遍历 node.right。)
示例:
输入:[8,5,1,7,10,12]
输出:[8,5,10,1,7,null,12]
提示:
1 <= preorder.length <= 100- 先序
preorder中的值是不同的。
来源:LeetCode
思路
先序遍历,所以根节点在前,左子树随后,右子树在最后。
又因为左子树全小于根节点,右子树全大于根节点。可以轻松将数组分割为根节点,左子树,右子树。
于是递归建树即可。
解法
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @desc 根据中间值将数组分为小于和大于中间值的两部分
* @param {number[]} array 要分割的数组
* @param {number} middle 中间值
* @returns {[number[], number[]]}
*/
const split = (array, middle) => {
let index = 0;
while (array[index] < middle) {
index++;
}
const left = array.slice(0, index);
const right = array.slice(index);
return [left, right];
};
/**
* @param {number[]} preorder
* @return {TreeNode}
*/
const bstFromPreorder = preorder => {
if (preorder.length === 0) return null;
const first = preorder.shift();
const [left, right] = split(preorder, first);
const root = new TreeNode(first);
root.left = bstFromPreorder(left);
root.right = bstFromPreorder(right);
return root;
};
