不得不说,憨憨脑袋没有递归~~~
1. 题目描述
2. 题目分析
- 题目意思很简单,遍历树的每一条路径,然后相加,返回最后结果
- 思路一:DFS【每次看代码就秒懂,自己每次都想不到】:递递归归,莫有脑袋。每次递归加上从一开始的值
- 思路二:BFS【个人最喜欢的】:维护两个队列,队列一存放root,队列二存放val,每次遍历抛出,队列二种始终更新这一条分树的值,最后相加
3. 题目代码
3.1 DFS
public int sumNumbers(TreeNode root) {
return dfs(root, 0);
}
public static int dfs(TreeNode root, int prevSum) {
if (root == null) {
return 0;
}
// 最开始是0层~
int sum = prevSum * 10 + root.val;
if (root.left == null && root.right == null) {
return sum;
} else {
return dfs(root.left, sum) + dfs(root.right, sum);
}
}
3.2 BFS
public int sumNumbers1(TreeNode root) {
if(root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
Queue<Integer> queue1 = new LinkedList<Integer>();
int sum = 0;
queue.add(root);
queue1.add(root.val);
while (!queue.isEmpty()) {
TreeNode tempNode = queue.poll();
int num = queue1.poll();
if(tempNode.left == null && tempNode.right == null) {
System.out.println(num);
sum += num;
}else {
if(tempNode.left != null) {
queue.add(tempNode.left);
queue1.add(num * 10 + tempNode.val);
}
if(tempNode.right != null) {
queue.add(tempNode.right);
queue1.add(num * 10 + tempNode.val);
}
}
}
return sum;
}
4. 总结
- 对于DFS而言,递归一定要看好入口和出口,准备开始刷刷递归的题目找找感觉。
- 对于BFS而言,队列进进出出,数值都比较明显,也便于自己操作
- 总而言之:题目刷多了,这种题就见怪不怪了。