题目:
给定一个整数数组,它表示BST(即 二叉搜索树 )的 先 序遍历 ,构造树并返回其根。
保证 对于给定的测试用例,总是有可能找到具有给定需求的二叉搜索树。
二叉搜索树 是一棵二叉树,其中每个节点, Node.left 的任何后代的值 严格小于 Node.val , Node.right 的任何后代的值 严格大于 Node.val。
二叉树的 前序遍历 首先显示节点的值,然后遍历Node.left,最后遍历Node.right。
算法:
func bstFromPreorder(preorder []int) *TreeNode {
var dfs func(start, end int) *TreeNode
dfs = func(start, end int) *TreeNode {
if start > end {
return nil
}
if start == end {
return &TreeNode{Val: preorder[start]}
}
pivot := searchLowBound(preorder, start + 1, end, preorder[start])
return &TreeNode{
Val: preorder[start],
Left: dfs(start + 1, pivot - 1),
Right: dfs(pivot, end),
}
}
return dfs(0, len(preorder) - 1)
}
func searchLowBound(preorder []int, start, end, val int) int {
// 注意边界条件这里要等于号,否则[4,2]会得到[4,null,2]
for start <= end {
if preorder[start] < val {
start ++
} else {
break
}
}
return start
}