leetcode-236-二叉树的最近公共祖先*

题目描述:

 

 

 

方法一:

# 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':
        ans = None
        def helper(root):
            nonlocal ans
            if not root:
                return False
            left = helper(root.left)
            right = helper(root.right)
            mid = root.val==p.val or root.val==q.val
            if mid + left + right >= 2:
                ans = root
            return mid or left or right
        helper(root)
        return ans

另:*

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if root in (None ,p,q):
            return root 
        L = self.lowestCommonAncestor(root.left,p,q)
        R =self.lowestCommonAncestor(root.right,p,q)
        return R if None==L else L if None==R else root

法二:转为相交链表找最近交点 见题160  理解:a+all+b = b+all+a

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        dic={root:None}
        def bfs(node):
            if node:
                if node.left:dic[node.left]=node
                if node.right:dic[node.right]=node
                bfs(node.left)
                bfs(node.right)
        bfs(root)
        l1,l2=p,q
        while(l1!=l2):
            l1=dic.get(l1) if l1 else q
            l2=dic.get(l2) if l2 else p
        return l1

 

posted @ 2019-10-07 17:28  oldby  阅读(168)  评论(0)    收藏  举报