难度:中等
频次:64
题目:
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
解题思路:DFS迭代
注意:
- DFS迭代的时候,终止条件是root==null,所以起始i每一条路径都有两个相等的和被放到res里,最后和得除以2
- 注意叶子节点
- 最终的结果sum如果用int会溢出
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int sumNumbers(TreeNode root) {
List<Integer> res=new ArrayList<>();
DFS(root,res,0,false);
//用int会溢出
double sum=0;
for(int num:res){
sum+=num;
}
//因为迭代的时候每个叶子节点都有左右两边双倍
return (int)(sum/2);
}
public void DFS(TreeNode root,List<Integer> res,int sum,boolean flag){
if(root==null){
//如果是父节点是叶子节点
if(flag){
res.add(sum);
}
return;
}
if(root.left==null&&root.right==null){
flag=true;
}
sum=sum*10+root.val;
DFS(root.left,res,sum,flag);
DFS(root.right,res,sum,flag);
}
}