经典算法题--判断一棵二叉树是否为二叉搜索树
来自LeetCode-98
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
分析:根据二叉搜索树的自身特点:任一节点的左子树都比自身节点要小,任一节点的右子树都比自身节点有大
可以有两种方法。
方法一:中序遍历二叉树,若其遍历完成后是个升序数列,则OK
def helper(node, lower = float('-inf'), upper = float('inf')): if not node: return True val = node.val if val <= lower or val >= upper: return False if not helper(node.right, val, upper): return False if not helper(node.left, lower, val): return False return True return helper(root)
方法二:递归。任一节点的左子树都比自身节点要小,任一节点的右子树都比自身节点要大
递归时需要传递min,max两个数值出去
def helper(node, lower = float('-inf'), upper = float('inf')): if not node: return True val = node.val if val <= lower or val >= upper: return False if not helper(node.right, val, upper): return False if not helper(node.left, lower, val): return False return True return helper(root)