Fork me on GitHub

leetcode-98之验证二叉搜索树

二叉搜索树(Binary Search Tree)也叫二叉查找树。

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

1
2
3
4
5
输入:
2
/ \
1 3
输出: true

示例 2:

1
2
3
4
5
6
7
8
9
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。

解题思路

利用二叉搜索树中序遍历得到是一个升序数组的特点,使用一个全局变量记录前一个节点,递归与当前节点比较,如果都比当前节点小,那么就是一个二叉搜索树

golang 实现

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
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}

func isValidBST(root *TreeNode) bool {
prev = nil
return helper(root)
}

var prev *TreeNode

func helper(root *TreeNode) bool {
if root == nil {
return true
}
if helper(root.Left) == false {
return false
}
if prev != nil && prev.Val >= root.Val {
return false
}
prev = root
return helper(root.Right)
}