Leetcod面试经典150题刷题记录 —— 二叉搜索树篇
遇到二叉搜索树(BST)的题目,一旦用了sort()
直接挂掉面试,切记!
二叉搜索树性质
二叉搜索树的性质满足:
(1)左节点 > root > 右节点 (局部性质
)
(2)左子树所有节点 > root > 右子树所有节点 (全局性质
,该性质包括局部性质,所以更重要)
相当部分程序员写起上面的局部性质很容易,写全局性质的判断就容易犯病,不瞒你说,我也是。
1. 二叉搜索树的最小绝对差
题目链接:二叉搜索树的最小绝对差 - leetcode
题目描述:
给你一个二叉搜索树的根节点root
,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。
题目归纳:
解题思路:
解法: 验证二叉搜索树 - leetcode官方题解
脏乱差版本
# 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
# 返回二叉搜索树中,任意两个不同节点值之间的最小差值
# 性质
# (1)二叉搜索树。题目既然说了,那么肯定要用到该性质
# (2)任意两个不同节点值,强调了任意两个不同节点。但是既然是二叉搜索树了,拿右子树中的节点 - 左子树中的节点肯定不会是答案,所以这里的任意其实是带引号的"任意",不是绝对的"任意",是可以忽略一些情况的"任意"
# 以root节点为例,要查找的目标点一定是下面两种情况
# (1)左树的最右节点 = 左树的最大节点 = 中序遍历的前驱pre节点
# (2)右树的最左节点 = 右树的最大节点 = 中序遍历的后继post节点
# 最后递归搜索
class Solution:
def getMinDistance(self, root: Optional[TreeNode]) -> int:
if not root: return 0
# (1)查找左树的最'右'节点 = 左树的最大节点
LR = root.left
while LR and (LR.left or LR.right):
# 有右边找右边,没右边找左边再找右边
if LR.right:
LR = LR.right
else:
break
# (2)查找右树的最'左'节点 = 右树的最大节点
RL = root.right
while RL and (RL.left or RL