LeetCode129. 求根到葉子節點數字之和
阿新 • • 發佈:2020-12-25
最笨的方法可以先求出所有的路徑,然後轉換成對應的數字,最後求和。但是時間效率很差(耗時3ms)
☆☆☆方法1:DFS
方法2:BFS
程式碼1:DFS(耗時0ms)
class Solution { public int sumNumbers(TreeNode root) { return dfs(root, 0); } // temp表示上一層所有節點的和 private int dfs(TreeNode root, int temp) { if (root == null) return 0; int sum = 10 * temp + root.val; //當前節點的值就是父節點的值*10+當前節點的值 if (root.left == null && root.right == null) { return sum; } return dfs(root.left, sum) + dfs(root.right, sum); } }
class Solution { int sum; public int sumNumbers(TreeNode root) { dfs(root, 0); return sum; }private void dfs(TreeNode root, int temp) { if (root == null) return; if (root.left == null && root.right == null) { sum += 10 * temp + root.val; } dfs(root.left, 10 * temp + root.val); dfs(root.right, 10 * temp + root.val); } }
程式碼2:BFS(耗時1ms)
class Solution { public int sumNumbers(TreeNode root) { int sum = 0; if (root == null) return sum; //維護兩個佇列,分別儲存節點和節點對應的數字。 Queue<TreeNode> nodeQueue = new LinkedList<>(); Queue<Integer> numQueue = new LinkedList<>(); nodeQueue.offer(root); numQueue.offer(root.val); while (!nodeQueue.isEmpty()) { TreeNode cur = nodeQueue.poll(); int num = numQueue.poll(); if (cur.left == null && cur.right == null) { sum += num; } if (cur.left != null) { nodeQueue.offer(cur.left); numQueue.offer(num * 10 + cur.left.val); } if (cur.right != null) { nodeQueue.offer(cur.right); numQueue.offer(num * 10 + cur.right.val); } } return sum; } }