Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”
Example 1:

Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 Output: 3 Explanation: The LCA of nodes 5 and 1 is 3.
Example 2:

Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 Output: 5 Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.
Example 3:
Input: root = [1,2], p = 1, q = 2 Output: 1
Constraints:
- The number of nodes in the tree is in the range
[2, 105]. -109 <= Node.val <= 109- All
Node.valare unique. p != qpandqwill exist in the tree.
My Solution:
# 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': inorder_list = [] def inorderTraverse(root): if not root: return None if not root.left and not root.right: inorder_list.append(root.val) elif root.left and not root.right: inorderTraverse(root.left) inorder_list.append(root.val) elif root.right and not root.left: inorder_list.append(root.val) inorderTraverse(root.right) else: inorderTraverse(root.left) inorder_list.append(root.val) inorderTraverse(root.right) inorderTraverse(root) def lca(root, p, q): root_idx = inorder_list.index(root.val) p_idx = inorder_list.index(p.val) q_idx = inorder_list.index(q.val) if p_idx == root_idx or q_idx == root_idx or p_idx < root_idx < q_idx or q_idx < root_idx < p_idx: return root elif p_idx < q_idx < root_idx or q_idx < p_idx < root_idx: return lca(root.left, p, q) elif root_idx < p_idx < q_idx or root_idx < q_idx < p_idx: return lca(root.right, p, q) return lca(root, p, q)

ChatGPT's Solution:
# 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': # Base case: if the root is None or root is one of p or q, return root if not root or root == p or root == q: return root # Recursively search for LCA in the left and right subtrees left = self.lowestCommonAncestor(root.left, p, q) right = self.lowestCommonAncestor(root.right, p, q) # If both left and right are not None, root is the LCA if left and right: return root # Otherwise, return the non-None child (if any) return left if left else right


浙公网安备 33010602011771号