1. 530. 二叉搜索树的最小绝对差
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入:root = [4,2,6,1,3]
输出:1
示例 2:
输入:root = [1,0,48,null,null,12,49]
输出: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:
prev = None
res = float('inf')
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
#看到二叉搜索树应该注意到其中序遍历为升序数组
def inorder(root: Optional[root]) -> None:
if not root: return
inorder(root.left)
if self.prev is not None and abs(root.val - self.prev) < self.res:
self.res = abs(root.val - self.prev)
self.prev = root.val
inorder(root.right)
inorder(root)
return self.res
2. 501. 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
提示:
- 树中节点的数目在范围
[1, 104]
内 -105 <= Node.val <= 105
思路:
中序遍历,使用全局变量prev记录上一个遍历的元素,
注意使用nonlocal或者self.res
# 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 findMode(self, root: Optional[TreeNode]) -> List[int]:
#同样遍历,需要prev记录上次遍历的节点,维护count, maxCount
#维护结果list: res
res = []
prev = None
count = 0
max_count = 0
def traversal(root: Optional[TreeNode]) -> None:
nonlocal prev, count, max_count, res
if not root:
return
traversal(root.left)
if prev is not None and root.val == prev.val:
count += 1
else:
count = 1
if count == max_count:
res.append(root.val)
elif count > max_count:
res = [root.val]
max_count = count
prev = root
traversal(root.right)
traversal(root)
return res
3. 236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
代码实现
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:return
if root == p or root == q:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if not left:
return right
if not right:
return left
return root