Leetcode 530
题目:二叉搜索树的最小差值
学习资料:代码随想录
实现思路
- 二叉平衡树的中序遍历是有序数组,利用这个特性,先转化为数组,再找最小差值
- 迭代法也可以,记录pre和cur进行对比
class Solution:
def __init__(self):
self.re = []
def traversal(self, root):
if not root:
return
self.traversal(root.left)
self.re.append(root.val)
self.traversal(root.right)
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
self.traversal(root)
ans = float("inf")
for i in range(len(self.re)-1):
ans = min(abs(self.re[i]-self.re[i+1]), ans)
return ans
####迭代法####
ans = float("inf")
cur = root
pre = None
s = []
while cur or s:
if cur:
s.append(cur)
cur = cur.left
else:
cur = s.pop()
if pre:
ans = min(abs(pre.val-cur.val), ans)
pre = cur
cur = cur.right
return ans
Leetcode 501
实现过程
- 中序遍历就是按大小顺序:
- base:标记当前的数字
- count:记录数字出现次数,如果数字与base相同,则count+=1;如果当前数字不等于base了说明新的数字出现,从新记录,将count设置为1.
- maxCount:用来记录当前的众数;如果count=maxCount,那么将当前元素添加到待选数组中;如果当前count > maxCount,则说明需要更新当前的众数,清除候选数组,更新值。
class Solution:
def __init__(self):
self.base = None
self.count = 0
self.maxCount = float("-inf")
self.re = []
def update(self,r_val):
if self.base == r_val:
self.count += 1
else:
self.base = r_val
self.count = 1
if self.count == self.maxCount:
self.re.append(r_val)
elif self.count > self.maxCount:
self.maxCount = self.count
self.re.clear()
self.re.append(r_val)
def traversal(self, root):
if not root:
return
self.traversal(root.left)
self.update(root.val)
self.traversal(root.right)
def findMode(self, root: Optional[TreeNode]) -> List[int]:
self.traversal(root)
return self.re
Leetcode 236
实现过程
- 该题需要自底向上返回,回溯的思想;而后序遍历是天然的回溯。
- 第一种情况,p和q在两个子树中,这时就是left和right都不为空,那么就返回root;如果root的子树只包含其中一个,那么就返回left或者right
- 第二种情况,p或q有一个就是他们的公共祖先了,那么这时就直接返回root即可。
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root or root == p or root ==q:
return root
l = self.lowestCommonAncestor(root.left, p, q)
r = self.lowestCommonAncestor(root.right, p, q)
if l and r:
return root
if not l and r :
return r
elif not r and l:
return l
else:
return None
return root
总结
- 二叉搜索树的中序遍历天然有序
- 一般如果想要自底向上返回的,需要利用后序遍历回溯的思想。