目录
530.二叉搜索树的最小绝对差
需要领悟一下二叉树遍历上双指针操作,优先掌握递归题目链接/文章讲解:代码随想录
视频讲解:二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili
思路
二叉搜索树的一个很重要的特性——中序遍历是一个有序的递增数组。有序递增数组求两个数的最小差值那不是有手就行。
代码
class Solution:
def __init__(self):
self.vec = []
def traversal(self, root):
if root is None:
return
self.traversal(root.left)
self.vec.append(root.val) # 将二叉搜索树转换为有序数组
self.traversal(root.right)
def getMinimumDifference(self, root):
self.vec = []
self.traversal(root)
if len(self.vec) < 2:
return 0
result = float('inf')
for i in range(1, len(self.vec)):
# 统计有序数组的最小差值
result = min(result, self.vec[i] - self.vec[i - 1])
return result
501.二叉搜索树中的众数
和 530差不多双指针思路,不过 这里涉及到一个很巧妙的代码技巧。
思路
这里首次引入了pre指针,采用的还是二叉树的中序遍历,每次和前一个数进行比较,如果一样,count就+1,每层遍历时在遍历中间节点后更新出现次数最大的数,注意每次更新最大的数需要把原来的res[ ] 清空,因为原来里面装的不是出现频率最大的数了。
代码
from collections import defaultdict
from typing import Optional, List
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def __init__(self):
self.res = []
self.count = 0
self.maxcount = 0
self.pre = None
def findMode(self, root: Optional[TreeNode]) -> List[int]:
self.count = 0
self.maxcount = 0
self.pre = None
self.res = []
self.traversal(root)
return self.res
def traversal(self, cur):
if not cur:
return None
# 左
self.traversal(cur.left)
# 中
if not self.pre:
self.count = 1
elif self.pre.val == cur.val:
self.count += 1
else:
self.count = 1
self.pre = cur
if self.count > self.maxcount: # 当前计数频率大于最大值频率,更新max,清空res
self.maxcount = self.count
self.res = []
if self.count == self.maxcount:
self.res.append(cur.val)
# 右
self.traversal(cur.right)
return
236. 二叉树的最近公共祖先
本题其实是比较难的,可以先看我的视频讲解
思路
这种题就是我看着好像知道什么个原理,实际上让我写写不了一点。。。(每日崩溃1/1)
这道题使用的是后序遍历,如果遍历到当前节点就是p或者q就返回当前节点,层层往回传,最后会传到根节点。(因为是后序遍历,哪怕找到了答案也要遍完的)(我知道我这么讲大家根本听不懂,所以点开视频看吧,Carl哥讲的超级nice,再配合代码应该可以看懂)
代码
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 root == p or root == q or root is None:
return root
left = self.lowestCommonAncestor(root.left,p,q)
right = self.lowestCommonAncestor(root.right,p,q)
if left is not None and right is not None:
return root
elif left is None and right is not None :
return right
elif left is not None and right is None:
return left
else:
return None