Given the root of a binary tree, return the lowest common ancestor of its deepest leaves.
Recall that:
The node of a binary tree is a leaf if and only if it has no children
The depth of the root of the tree is 0. if the depth of a node is d, the depth of each of its children is d + 1.
The lowest common ancestor of a set S of nodes, is the node A with the largest depth such that every node in S is in the subtree with root A.
Example 1:
Input: root = [3,5,1,6,2,0,8,null,null,7,4]
Output: [2,7,4]
Explanation: We return the node with value 2, colored in yellow in the diagram.
The nodes coloured in blue are the deepest leaf-nodes of the tree.
Note that nodes 6, 0, and 8 are also leaf nodes, but the depth of them is 2, but the depth of nodes 7 and 4 is 3.
Example 2:
Input: root = [1]
Output: [1]
Explanation: The root is the deepest node in the tree, and it's the lca of itself.
Example 3:
Input: root = [0,1,3,null,2]
Output: [2]
Explanation: The deepest leaf node in the tree is 2, the lca of one node is itself.
Constraints:
The number of nodes in the tree will be in the range [1, 1000].
We design a function dfs(root) that returns a tuple (l, d), where l is the deepest common ancestor of node root, and d is the depth of node root. The execution logic of the function dfs(root) is as follows:
If root is null, return the tuple (None, 0);
Otherwise, we recursively call dfs(root.left) and dfs(root.right), obtaining tuples (l, d1) and (r, d2). If d1 > d2, the deepest common ancestor of root is l, and the depth is d1 + 1; if d1 < d2, the deepest common ancestor of root is r, and the depth is d2 + 1; if d1 = d2, the deepest common ancestor of root is root, and the depth is d1 + 1.
In the main function, we call dfs(root) and return the first element of its return value to get the deepest common ancestor node.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Here, \(n\) is the number of nodes in the binary tree.
1 2 3 4 5 6 7 8 91011121314151617181920
# 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 = rightclassSolution:deflcaDeepestLeaves(self,root:Optional[TreeNode])->Optional[TreeNode]:defdfs(root):ifrootisNone:returnNone,0l,d1=dfs(root.left)r,d2=dfs(root.right)ifd1>d2:returnl,d1+1ifd1<d2:returnr,d2+1returnroot,d1+1returndfs(root)[0]
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */typepairstruct{first*TreeNodesecondint}funclcaDeepestLeaves(root*TreeNode)*TreeNode{vardfsfunc(root*TreeNode)pairdfs=func(root*TreeNode)pair{ifroot==nil{returnpair{nil,0}}l,r:=dfs(root.Left),dfs(root.Right)d1,d2:=l.second,r.secondifd1>d2{returnpair{l.first,d1+1}}ifd1<d2{returnpair{r.first,d2+1}}returnpair{root,d1+1}}returndfs(root).first}