前言:
“验证二叉搜索树”的题目是力扣题库上的第98题。我是使用Python3编写的解法,性能算不上好,在此仅仅只是阐述一下解法编程思想。仅供参考~
解法上可能会跟别人相同,所以要是看不懂下面的阐述的话可以去力扣对应的题目上查看其他人的解题思路~
问题描述:
题目的要求是:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
LeetCode给出的有效二叉搜索树定义如下:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
LeetCode官方给的示例如下:
示例一:
输入:root = [2,1,3]
1
/ \
2 3
输出:true
示例二:
输入:root = [5,1,4,null,null,3,6]
5
/ \
1 4
/ \
3 6
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示:
- 树中节点数目范围在
[1, 104]
内 -2^31 <= Node.val <= 2^31 - 1
解题思路:
首先,需要明白官方给出的有效二叉搜索树的定义背后的含义,这个含义就是当我们用中序遍历的遍历方式遍历搜索树后,得到的顺序是严格递增的顺序的,而无效的二叉搜索树得到的则不是一个严格递增的顺序。如LeetCode官方给的示例中,第一个示例的中序遍历为:1、2、3,是严格递增的,故返回True;而示例二得到中序遍历是:1、5、3、4、6,不是递增的,所以返回False。
其次,需要注意一点就是,根据题意,有效二叉搜索树的节点其左右子树是小于和大于该节点的值的。也就是说,当左右子树出现等于该节点的值时,依旧是要返回False。如当输入的树为[2,2,2]时,返回False。
最后,根据上面描述的,我们可以采用递归的方法,对树进行中序遍历(左根右),并将其中序遍历的顺序插入到一个列表中,遍历完之后查看列表中的值,如是严格递增的,则返回True,否则返回False。
相关代码:
# 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:
# 获取树中序遍历的顺序
def getMiddle(tree,numList):
if tree is not None:
# 若有左子树,则遍历左子树
if tree.left is not None:
getMiddle(tree.left,numList)
# 将当前的值插入列表
numList.append(tree.val)
# 若有右子树,则遍历右子树
if tree.right is not None:
getMiddle(tree.right,numList)
numList=[]
# 递归获取树的中序遍历顺序
getMiddle(root,numList)
num=numList[0]
# 从左往右依次遍历,查看是否为严格递增顺序,否则返回False
for i in numList[1:]:
if i>num:
num=i
else:
return False
return True