今天的题主要要理解逻辑
530. Minimum Absolute Difference in BST
这道题如果借助额外的array的话,会简单很多.对于bst来说, inorder 的遍历的值一定是单调递增的
Way1:
inorder遍历bst,然后将数值存在array里面,之后遍历array算差值找到最小的插值
class Solution:
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
res=[]
def inorder(node):
if not node:
return
inorder(node.left)
res.append(node.val)
inorder(node.right)
inorder(root)
val=float("inf")
for i in range(len(res)-1):
val=min(val,res[i+1]-res[i])
return val
501. Find Mode in Binary Search Tree
这道题还是要用遍历. 但是额外借助的数据结构上可以做很多的优化
Way1:
用hashmap再遍历的过程中来记录次数.然后找到最大的次数并输出相对的值
class Solution:
def findMode(self, root: Optional[TreeNode]) -> List[int]:
dic={}
def dfs(node):
if not node:
return
dfs(node.left)
if node.val not in dic:
dic[node.val]=1
else:
dic[node.val]+=1
dfs(node.right)
dfs(root)
maxval=max(dic.values())
res=[]
for k,v in dic.items():
if v==maxval:
res.append(k)
return res
Way2:
这种方法要用多个variable和一个array来取代hashmap. 同时这些要是全局的.还是用inorder遍历,涉及到值的操作的时候要判断最大的mode的值还有对当前的值的计数
class Solution:
def findMode(self, root: Optional[TreeNode]) -> List[int]:
self.count=0
self.max_count=0
self.res=[]
self.pre=TreeNode()
def dfs(node):
if not node:
return
dfs(node.left)
if not self.pre:
self.count=1
elif node.val==self.pre.val:
self.count+=1
else:
self.count=1
self.pre=node
if self.count==self.max_count:
self.res.append(node.val)
if self.count >self.max_count:
self.max_count=self.count
self.res=[node.val]
dfs(node.right)
dfs(root)
return self.res
236. Lowest Common Ancestor of a Binary Tree
这道题的一个关键点在于怎么用返回值.如果需要返回值,则需要left和right分别调用,如果不需要返回值则直接用if node.left 和if node.right
Way1:
遍历的过程中判断左右子树是否看到了q或者p的值,根据不同的情况来决定输出哪个node
如果都找到了,则证明当前的node为答案
如果只找到一个则往上返回找到的哪个node
如果为空node,则返回当前的node
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root==q or root==p or not root:
return root
left=self.lowestCommonAncestor(root.left,p,q)
right=self.lowestCommonAncestor(root.right,p,q)
if left and right:
return root
if left and not right:
return left
if not left and right:
return right