#LAISIR38. 棋盤之下 · 高塔對決

棋盤之下 · 高塔對決

🧮 題目名稱:棋盤之下 · 高塔對決


📝 題目背景:

在戰棋遊戲《幻域高塔》中,玩家以一棵二元軍事建築樹來佈局棋盤上的高塔單位。每個單位佔據棋盤上的一格位置,並具有一個代表其「高度」的數值。

整棵軍事樹從上往下建構,左子節點代表位於棋盤左側的單位,右子節點則位於右側。遊戲結束時,系統將從棋盤底部往上觀察整個佈陣,並輸出在每個橫向位置上,高度最高的單位編號


🎯 任務說明:

請你根據軍事建築的完全先序遍歷序列(包含空節點 "null"),建構這棵樹,並計算從底部觀察時能看到的單位。

觀察規則如下:

  • 根節點位於橫向位置 x = 0。
  • 左子節點橫向位置為 x - 1,右子節點為 x + 1。
  • 每個位置上只能看到高度最高的單位
  • 若某個位置從未有單位佔據,則不輸出任何內容。
  • 多個單位佔據同一位置時,以高度較大者為準

📥 輸入格式:

第一行一個整數 n(1 ≤ n ≤ 10^5):先序遍歷節點數量(包含 "null")。

接下來 n 行,每行一個節點資訊,格式如下:

  • 若為非空節點:id height(字串+整數),例如:A 5
  • 若為空節點:字串 "null"

說明:

  • id 為不含空格的英數編號,長度不超過 10。
  • height 為 1 ≤ height ≤ 10^5 的整數。
  • 編號互不相同。
  • 輸入保證能構成一棵合法的二元樹。

📤 輸出格式:

一行,輸出所有從棋盤底部能看到的單位編號(id),依橫向位置 x 從小到大排列,中間以空格分隔。


📘 範例輸入:

13
A 5
B 3
D 6
null
null
E 4
null
null
C 2
null
F 7
null
null

📗 範例輸出:

D B A F

🌳 樹形結構說明:

根據先序遍歷重建的樹為:

        A(5)
       /    \
    B(3)     C(2)
   /   \        \
D(6)  E(4)      F(7)

橫向位置與節點分佈如下:

x 座標 節點序列 高度最高者
-2 D(6) D
-1 B(3) B
0 A(5), E(4) A
1 C(2) C
2 F(7) F

最終輸出為從 x = -2 到 x = 2 中每個位置的最高者(跳過 C 因其未覆蓋任何新的 x):

D B A F