#LAISIR23. 題目名稱:族譜之源

題目名稱:族譜之源

📝 題目描述:

在一個古老的部族中,長老們用一棵二元樹記錄了族人的血緣關係。每個節點代表一名族人,其左子節點與右子節點為其直系子女。現在長老們想查找兩位族人的最近共同祖先(Lowest Common Ancestor,簡稱 LCA),也就是在這棵族譜樹中離他們最近的共同祖先。

你的任務是根據族譜的樹結構與兩位族人的姓名,輸出他們的最近共同祖先姓名。


📥 輸入格式:

輸入為多行格式:

  1. 第一行一個整數 n(1 ≤ n ≤ 10⁴),表示節點總數(每人唯一)。

  2. 接下來 n 行,每行包含三個字串:parent left right

    • parent:父節點的名字
    • left:左子節點名字,若無為 "null"
    • right:右子節點名字,若無為 "null"

接下來一行包含兩個字串 a b,表示要查詢的兩位族人名字。


📤 輸出格式:

  • 輸出一行,為 ab 的最近共同祖先的名字。

📊 數據範圍:

  • 所有節點名稱為僅含英文字母的非空字串,長度不超過 20。
  • 保證 n 個節點構成一棵合法的有根二元樹
  • ab 一定存在於樹中。
  • 名字不重複。

📘 輸入範例:

7
A B C
B D E
C F G
D null null
E null null
F null null
G null null
D G

📗 輸出範例:

A

💡 範例說明:

樹的結構如下:

        A
       / \
      B   C
     / \ / \
    D  E F  G

D 和 G 的最近共同祖先是 A。