「垂直結構」指將二元樹節點依據 水平距離 分組:根節點 HD=0,左子節點 HD-1,右子節點 HD+1。相同 HD 的節點屬於同一條垂直線,按 HD 從小到大輸出,同 HD 內按層級(Top-to-Bottom)排序。
1 (HD=0)
/ \
2(-1) 3(+1)
/ \ / \
4(-2)5(0)6(0)7(+2)
\ \
8(+1) 9(+3)
垂直線分組:
最終輸出:4 2 1 5 6 3 8 7 9
// Java 參考實作
public List> verticalOrder(TreeNode root) {
Map> cols = new TreeMap<>(); // 自動按 HD 排序
Queue> q = new LinkedList<>();
if (root != null) q.offer(new Pair<>(root, 0));
while (!q.isEmpty()) {
Pair p = q.poll();
TreeNode node = p.getKey();
int hd = p.getValue();
cols.computeIfAbsent(hd, k -> new ArrayList<>()).add(node.val);
if (node.left != null) q.offer(new Pair<>(node.left, hd - 1));
if (node.right != null) q.offer(new Pair<>(node.right, hd + 1));
}
return new ArrayList<>(cols.values());
}
關鍵點:
✅ 使用 TreeMap 自動維護 HD 順序
✅ BFS 保證同 HD 節點按層級順序入列
✅ 時間/空間複雜度皆為 O(N)
Map>> 記錄 (HD, Level) → 值列表再排序。map[hd] = node.val。