98. 验证二叉搜索树
原始题目链接:https://leetcode-cn.com/problems/validate-binary-search-tree/
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
解题思路:
最简单的想法,根据中序遍历有序来判断。 实现方式可以分为两种:
1、递归;
2、迭代;
具体实现看代码。
代码实现:
1、递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
# 按照中序遍历顺序的当前节点的前一个节点
self.pre = None
def in_order_dfs(root):
if not root:
return True
if not in_order_dfs(root.left):
return False
if self.pre and self.pre.val >= root.val:
return False
self.pre = root
return in_order_dfs(root.right)
return in_order_dfs(root)
2、迭代
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
# 迭代解法,使用栈存储进出的节点
stack = []
# 当前节点
cur_node = root
# 按照中序遍历:当前节点的前一个节点
pre_node = None
while cur_node or stack:
# 中序遍历
# 遍历左子树的节点
while cur_node:
# 用栈存储遍历的节点
stack.append(cur_node)
cur_node = cur_node.left
# 栈需要弹出最后入栈的节点
cur_node = stack.pop()
# 判断逻辑
if pre_node and pre_node.val >= cur_node.val:
return False
# 遍历右子树的节点
pre_node = cur_node
cur_node = cur_node.right
return True
参考文献:
https://leetcode-cn.com/problems/validate-binary-search-tree/solution/die-dai-yu-di-gui-by-powcai/