二叉查找树的定义
左子树节点的值都小于根节点的值,右子树节点的值都大于根节点的值
问题描述
判断一棵树是否为二叉查找树?
例子下面就是二叉查找树
代码
//判断一棵二叉树是否为二叉查找树
func p_isValidBST(root:TreeNode?) -> Bool {
return helper(node: root, min: nil, max: nil)
}
private func helper(node: TreeNode?, min: Int?,max:Int?) -> Bool {
guard let node = node else {
return true
}
//所有右子树节点的值必须大于根几点的值
if let min = min ,node.val <= min
{
return false
}
//所有左子树节点的值必须都小于根节点的值
if let max = max, node.val >= max {
return false
}
return helper(node: node.left, min: min, max: node.val) && helper(node: node.right, min: node.val, max: max)
}
测试
@objc func isValidBST()
{
//给定二叉树 [50, 20, 60, 15, 30,70]
let root = TreeNode.init(val: 50)
root.left = TreeNode.init(val: 20)
root.right = TreeNode.init(val: 60)
let second = root.left
second?.left = TreeNode.init(val: 15)
second?.right = TreeNode.init(val: 30)
let thred = root.right
thred?.right = TreeNode.init(val: 70);
let result = self.p_isValidBST(root: root)
print("判断一棵二叉树是否为二叉查找树\(result)")
}
结果
注意点
- 二叉树本身是有递归定义的,所以,从原理上讲,所有二叉树的东西都可以用递归来解
- 二叉树这类题目很容易牵扯到是往左还是往右问题,所以在写helper 函数时要想到有两个相对应的参数
- 记得处理节点为nil 的情况,尤其要注意根节点为nil 的情况