前序遍历构造二叉搜索树:前序位置构造二叉搜索树
#二叉树的构造
#算法/BST
- 普通二叉树:前序和中序构造二叉树,然后就转换成 105. 从前序与中序遍历序列构造二叉树
- BST 的特点
- 左子树都比根节点的值小,右子树都比根节点的值大。
- 所以如何找到根节点?前序遍历的第一个就是根节点。
- 如何找到左右子树?
- 比根节点小的就是左子树的节点
- 比根节点大的就是右子树的节点
var bstFromPreorder = function (preorder) {
return build(preorder, 0, preorder.length - 1);
function build(preorder, start, end) {
if (start > end) return null;
let rootVal = preorder[start];
let root = new TreeNode(rootVal);
// 根据 BST 的特点,左子树都比根节点的值小,右子树都比根节点的值大
// p 就是左右子树的分界点
let p = start + 1;
while (p <= end && preorder[p] < rootVal) {
p++;
}
// [start+1, p-1] 区间内是左子树元素
root.left = build(preorder, start + 1, p - 1);
// [p, end] 区间内是右子树元素
root.right = build(preorder, p, end);
return root;
}
};
这题和 255. 验证二叉搜索树的前序遍历序列 类似