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

74 阅读1分钟

题目:
给定一个整数数组,它表示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
}