題目:給定二叉樹,返回所有從根節點到葉子節點的路徑。路徑格式如 "1->2->5"。例如輸入 [1,2,3,null,5],輸出 ["1->2->5","1->3"]。
List path 。path.add(node.val)。left==null && right==null),將路徑轉字符串加入結果集。new ArrayList(path) 副本,自動實現回溯(無需手動 remove)。List。class Solution {
public List binaryTreePaths(TreeNode root) {
List result = new ArrayList<>();
if (root == null) return result;
dfs(root, new ArrayList<>(), result);
return result;
}
private void dfs(TreeNode node, List path, List result) {
if (node == null) return;
path.add(node.val);
if (node.left == null && node.right == null) {
result.add(pathToString(path));
return;
}
if (node.left != null) dfs(node.left, new ArrayList<>(path), result);
if (node.right != null) dfs(node.right, new ArrayList<>(path), result);
}
private String pathToString(List path) {
StringBuilder sb = new StringBuilder();
sb.append(path.get(0));
for (int i = 1; i < path.size(); i++) sb.append("->").append(path.get(i));
return sb.toString();
}
}
O(N),每個節點訪問一次,路徑複製總長度 O(N)(每條邊被複製常數次)。O(H) 遞歸棧 + O(N) 結果存儲,H 為樹高。List + 手動 add/remove 回溯,避免創建大量 ArrayList 副本(空間優化)。