# 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 getMinimumDifference(self, root: Optional[TreeNode]) -> int:
self.ans = []
res = self.helper(root)
temp = float('inf')
for i in range(len(res)-1):
temp = min(temp, abs(res[i] - res[i+1]))
return temp
def helper(self, root): #step1
#step2
if root is None:
return self.ans
#step3
if root.left:
self.helper(root.left)
self.ans.append(root.val)
if root.right:
self.helper(root.right)
return self.ans
双指针递归解法:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def getMinimumDifference(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.temp = float('inf')
self.pre = None
return self.helper(root)
def helper(self, cur):#step1
#step2
if cur is None:
return
#step3
#左
self.helper(cur.left)
#中
if self.pre:
self.temp = min(self.temp, cur.val - self.pre.val)
self.pre = cur
#右
self.helper(cur.right)
return self.temp
# 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':#step1
#step2
if root is None:
return None
if root == p or root == q:
return root
#step3
'''因为需要从下往上进行处理,所以需要后序遍历(回溯),也就是先处理 左右 并返回给中,然后再进行 中 的逻辑处理'''
#左:左子树是否有p或q
left = self.lowestCommonAncestor(root.left, p, q)
#右:右子树是否有p或q (因为题目明确说明 p!=q, 所有一侧有p,那么另一侧最多只能有q。这一点很重要!)
right = self.lowestCommonAncestor(root.right, p, q)
#中
if left and right:
return root
elif not left and right:
return right
elif left and not right:
return left
else:
return None