前言
本文尝试讲解两道常见的有关二叉搜索树的问题,以期让你理解一些相关概念和用途。
Leetcode.700 二叉搜索树的搜索![](https://i-blog.csdnimg.cn/blog_migrate/58f5692c3a402bd99f636585229bcf38.png)
题解代码:
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
# 递归
if root is None: return None
if root.val == val:
return root
return self.searchBST(root.right, val) if root.val < val else self.searchBST(root.left, val)
# 迭代
if root is None: return None
while root:
if root.val == val: return root
root = root.left if root.val > val else root.right
return None
依旧是两种思路:递归和迭代。
从递归的角度看,我们只需要不断地判断一个节点的左右子树是否为所求的val即可。
从迭代的角度看,我们进行循环操作,在判定root之后,接着根据root.val和所求的val的大小,选择要接着循环哪一棵子树。
Leetcode.98 ![](https://i-blog.csdnimg.cn/blog_migrate/b2da0bfe27f60254669c6a3ee84ae75c.png)
题解代码:
# 原理:中序遍历一课二叉树,结果必然是升序,所以只要融合中序遍历,随后判断前后大小即可
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
def recur(root,left=float('-inf'),right=float('inf')):
if root is None:
return True
val = root.val
if val >= right or val <= left:
return False
if not recur(root.left,left,val):
return False
if not recur(root.right,val,right):
return False
return True
return recur(root)
二叉搜索树的一个重要性质在于,如果我们中序遍历一课二叉搜索树,得到的结果一定是一个升序数组。
我们利用这个性质,写一个递归函数,用来判断一个节点与左边界、右边界的关系(这两个边界通常也是节点的左子节点),我们可以判断左右子树即可。