LeetCode 98. Validate Binary Search Tree 题解
LeetCode 98. Validate Binary Search Tree 题解题目描述给你一个二叉树的根节点root判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1输入root [2,1,3] 输出true示例 2输入root [5,1,4,null,null,3,6] 输出false 解释根节点的值是 5 但是右子节点的值是 4 。解题思路方法一递归中序遍历思路二叉搜索树的中序遍历结果应该是一个严格递增的序列递归中序遍历二叉树同时记录前一个节点的值每次遍历到当前节点时检查其值是否大于前一个节点的值如果出现非递增的情况返回 false复杂度分析时间复杂度O(n)其中 n 是二叉树中的节点个数。每个节点只被访问一次。空间复杂度O(h)其中 h 是二叉树的高度。递归调用的栈空间取决于二叉树的高度最坏情况下为 O(n)。方法二迭代中序遍历思路使用栈来模拟递归过程中序遍历二叉树同时记录前一个节点的值每次遍历到当前节点时检查其值是否大于前一个节点的值如果出现非递增的情况返回 false复杂度分析时间复杂度O(n)其中 n 是二叉树中的节点个数。每个节点只被访问一次。空间复杂度O(h)其中 h 是二叉树的高度。栈的大小取决于二叉树的高度最坏情况下为 O(n)。方法三递归范围限定思路递归地检查每个节点的值是否在合法范围内对于根节点范围是 (-∞, ∞)对于左子节点范围是 (父节点的下界, 父节点的值)对于右子节点范围是 (父节点的值, 父节点的上界)如果任何节点的值超出了其合法范围返回 false复杂度分析时间复杂度O(n)其中 n 是二叉树中的节点个数。每个节点只被访问一次。空间复杂度O(h)其中 h 是二叉树的高度。递归调用的栈空间取决于二叉树的高度最坏情况下为 O(n)。代码实现方法一递归中序遍历# Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution: def isValidBST(self, root: Optional[TreeNode]) - bool: self.prev None return self.inorder(root) def inorder(self, node): if not node: return True # 遍历左子树 if not self.inorder(node.left): return False # 检查当前节点是否大于前一个节点 if self.prev is not None and node.val self.prev: return False self.prev node.val # 遍历右子树 return self.inorder(node.right)方法二迭代中序遍历# Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution: def isValidBST(self, root: Optional[TreeNode]) - bool: stack [] prev None while root or stack: # 遍历左子树 while root: stack.append(root) root root.left # 处理当前节点 root stack.pop() if prev is not None and root.val prev: return False prev root.val # 遍历右子树 root root.right return True方法三递归范围限定# Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution: def isValidBST(self, root: Optional[TreeNode]) - bool: return self.validate(root, float(-inf), float(inf)) def validate(self, node, low, high): if not node: return True # 检查当前节点是否在合法范围内 if node.val low or node.val high: return False # 递归检查左右子树 return (self.validate(node.left, low, node.val) and self.validate(node.right, node.val, high))测试用例测试用例 1输入[2,1,3]输出true测试用例 2输入[5,1,4,null,null,3,6]输出false测试用例 3输入[1,1]输出false测试用例 4输入[]输出true总结本题是二叉搜索树的经典问题主要考察对二叉搜索树性质的理解和遍历方法的应用。三种方法各有特点递归中序遍历利用二叉搜索树中序遍历结果递增的性质代码简洁易懂。迭代中序遍历避免了递归的栈溢出问题适用于深度较大的树。递归范围限定直接根据二叉搜索树的定义进行验证逻辑清晰。在实际应用中这三种方法都可以有效解决问题选择哪种方法主要取决于个人偏好和具体场景。对于一般的二叉树递归方法通常是最直观的选择。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2464824.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!