找工作刷题记录_013验证二叉搜索树

⼆叉搜索树(英语:Binary Search Tree),也称⼆叉搜索树、有序⼆叉树(英语:ordered binary tree),排序⼆叉树(英语:
sorted binary tree),是指⼀棵空树或者具有下列性质的⼆叉树:
1. 若任意节点的左⼦树不空,则左⼦树上所有结点的值均⼩于它的根结点的值;
2. 若任意节点的右⼦树不空,则右⼦树上所有结点的值均⼤于它的根结点的值;
3. 任意节点的左、右⼦树也分别为⼆叉查找树。

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

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

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

示例 1:

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

示例 2:

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

思路:中序遍历,是升序的则是对的,只需要保存前继节点就可以了;使用递归,左子树所有节点的最大值小于根节点,右子树所有节点的最小值大于根节点。

class Solution:
    def isValidBST(self, root):

        """
        :type root: TreeNode
        :rtype: bool
        """
        self.prev = None
        return self.helper(root)
    def helper(self, root):
        if root is None:
            return True
        if not self.helper(root.left):
            return False
        if self.prev and self.prev.val >= root.val:
            return False
        self.prev = root
        return self.helper(root.right)

 

### 如何验证一个二叉树是否二叉搜索树 为了验证给定二叉树是否二叉搜索树(Binary Search Tree, BST),可以利用二叉搜索树的关键性质:对于任意点 `node`,其左子的所有点值都小于该点值,右子的所有点值都大于该点值。 以下是两种常见的方法: #### 方法一:基于中序遍历的方法 通过中序遍历二叉树,如果是一棵合法的二叉搜索树,则会得到一个严格递增的数值序列。具体实现如下: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def isValidBST(root: TreeNode) -> bool: stack, prev_val = [], float(&#39;-inf&#39;) while root or stack: while root: stack.append(root) root = root.left node = stack.pop() # 如果当前点值不大于前驱点值,则不是有效BST if node.val <= prev_val: return False prev_val = node.val root = node.right return True ``` 这种方法的核心在于维护一个变量 `prev_val` 来记上一次访问的点值,并确保每次新访问的点值都要比它大[^2]。 #### 方法二:基于上下界范围的方法 另一种方式是从点开始递归地检查每个是否满足二叉搜索树的定义条件——即它的值应在某个范围内。初始时整个点应位于负无穷到正无穷之间;随后每进入左子则更新上限,进入右子则更新下限。 ```python def helper(node, lower=float(&#39;-inf&#39;), upper=float(&#39;inf&#39;)): 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 def isValidBST(root: TreeNode) -> bool: return helper(root) ``` 此方法的优点是可以提前终止不必要的后续计算,在某些情况下效率更高[^1]。 以上两种方法均能有效地判定一棵二叉树是否符合二叉搜索树的要求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值