Leetcode1676. Lowest Common Ancestor of a Binary Tree IV [Python]

初步的思路是把长度超过2的node做2分,划分到长度为1 或者2的node sublist,这样就可以拿到LCA里处理。但是这样做会在第54(/57)个TC处TLE。先把这个写法留下,之后写可以全部过的版本。

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', nodes: 'List[TreeNode]') -> 'TreeNode':
        
        if len(nodes) == 1:return nodes[0]
        if len(nodes) == 2:return self.findLCA(root, nodes[0], nodes[1])
        if len(nodes) > 2:
            sep = len(nodes)//2
            nodelist1 = nodes[:sep]
            nodelist2 = nodes[sep:]
            ans1 = self.lowestCommonAncestor(root, nodelist1)
            ans2 = self.lowestCommonAncestor(root, nodelist2)
        return self.findLCA(root, ans1, ans2)
        
    def findLCA(self, root, node1, node2):
        if not root:return None
        if root.val == node1.val or root.val == node2.val:return root
        
        leftpath = self.findLCA(root.left, node1, node2)
        rightpath = self.findLCA(root.right, node1, node2)
        
        if leftpath and rightpath:return root
        
        return leftpath if leftpath else rightpath

接下来是全部通过的版本,其实只要这样思考,root在nodes中,那一定是nodes, 而不在,则尝试root.left 和root.right看是否在nodes中,在就返回,不在,则继续node的left和right的left和right孙节点是否在nodes中,直到找到。

class Solution:
	def lowestCommonAncestor(self, root: 'TreeNode', nodes): 
		if not root:return None
		if root in nodes:return root
		left = self.lowestCommonAncestor(root.left, nodes)
		right = self.lowestCommonAncestor(root.right, nodes)
		if left and right:return root
		if left:return left
		if right:return right
		return None
上一篇:蓝桥杯 自行车停放(链表)


下一篇:LeetCode-147-对链表进行插入排序