题解 | #判断是不是二叉搜索树#
判断是不是二叉搜索树
https://www.nowcoder.com/practice/a69242b39baf45dea217815c7dedb52b
方法一:前序遍历
在根节点处,判断当前值是否处于(left,right)区间内,
- 处于区间内,用root.val分别更新为左子树的右节点和右子树的左节点
- 不处于区间内则返回False
# class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def isValidBST(self , root: TreeNode) -> bool: return self.check(root, float("-inf"), float("inf")) def check(self, root, left, right): if root is None: return True if left < root.val < right: return self.check(root.left, left, root.val) and self.check(root.right, root.val, right) else: return False
二、中序遍历
- 先遍历左子树,设置pre变量
- 比较节点值与pre变量大小(pre < root.val)
- 变量右子树
# class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def isValidBST(self , root: TreeNode) -> bool: self.pre = None return self.traversal(root) def traversal(self,root): if root is None: return True flag = self.traversal(root.left) if not flag: return False if self.pre is None: self.pre = root.val return self.traversal(root.right) else: if root.val > self.pre: self.pre = root.val return self.traversal(root.right) else: return False
三、后序遍历
- 先遍历左子树获取左边的l_min和l_max
- 再遍历右子树获取右边的r_min和r_max
- 通过比较root.val和l_max和r_min的大小判断其是不是二叉搜索树
class Solution: def isValidBST(self , root: TreeNode) -> bool: _, l_max = self.traversal(root.left) r_min, _ = self.traversal(root.right) return l_max < root.val < r_min def traversal(self,root): if root is None: return float("inf"), float("-inf") l_min, l_max = self.traversal(root.left) r_min, r_max = self.traversal(root.right) if l_max < root.val < r_min: return min(l_min, root.val), max(r_max,root.val) # 因为l_min和r_max一开始是inf和-inf,所以需要用min和max else: return float("-inf"), float("inf") # 通过返回(-inf,inf),确保后面一定不是二叉搜索树