530.二叉搜索树的最小绝对差
二叉搜索树按照中序遍历为递增序列,计算最小绝对差只需要计算相邻两个元素之间的差值,找出最小值。
可以遍历二叉树,得到数组,然后计算;也可以在遍历的时候直接计算,和之前的验证二叉树是一个思路
递归三部曲
- 参数为当前节点,无需返回值
- 终止条件:当前节点为空则返回
- 计算当前节点与前一个节点的值,并和之前的最小值进行比较
class Solution:
def __init__(self):
self.pre = None
self.res = float('inf')
def traversal(self, node):
if not node:
return
self.traversal(node.left)
if self.pre:
self.res = min(self.res, node.val-self.pre.val)
self.pre = node
self.traversal(node.right)
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
self.traversal(root)
return self.res
501.二叉搜索树中的众数
中序遍历,计算频率的代码技巧需好好学习
class Solution:
def __init__(self):
self.pre = None
self.count = 0
self.max_count = 0
self.result = []
def searchBST(self, node):
if not node:
return
self.searchBST(node.left)
if self.pre is not None and self.pre.val == node.val:
self.count += 1
else:
self.count = 1
self.pre = node
if self.count == self.max_count:
self.result.append(node.val)
if self.count > self.max_count:
self.result = [node.val]
self.max_count = self.count
self.searchBST(node.right)
def findMode(self, root: Optional[TreeNode]) -> List[int]:
self.searchBST(root)
return self.result
236. 二叉树的最近公共祖先
后序遍历
递归三部曲:
- 参数为当前节点,p和q,返回值为节点,因此可利用题目给出的函数
- 终止条件:当前节点为空,返回空;当前节点为p或者q返回当前节点
- 单层逻辑:如果左子树和右子树都不为空,则返回当前节点;如果左子树为空,右子树不为空,返回右子树;如果左子树不为空,右子树为空,返回左子树;如果左右子树都为空,则返回空
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root or root == p or root == q:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left and right:
return root
if left:
return left
if right:
return right
return None