最笨的方法可以先求出所有的路径,然后转换成对应的数字,最后求和。但是时间效率很差(耗时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; } }