ZhangZhihui's Blog  

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.val are unique.
  • p != q
  • p and q will 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

 

 

posted on 2025-03-27 19:46  ZhangZhihuiAAA  阅读(14)  评论(0)    收藏  举报