题目链接
题目描述
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
- 例如,从根节点到叶节点的路径
1 -> 2 -> 3表示数字123。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
示例 1:

输入: root = [1,2,3]
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25
示例 2:

输入: root = [4,9,0,5,1]
输出: 1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026
提示:
- 树中节点的数目在范围
[1, 1000]内 0 <= Node.val <= 9-
解题思路
方法一:dfs
这不有手就能写?
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {public:int sumNumbers(TreeNode* root) {dfs(root,0);return ans;}void dfs(TreeNode* root,int sum){if(root==nullptr)return;sum = sum*10 + root->val;if(root->left==nullptr&&root->right==nullptr){ans += sum;}dfs(root->left,sum);dfs(root->right,sum);}private:int ans = 0;};
时间复杂度 O(n)
-
方法二:bfs 需要队列,不推荐,但是要求非递归的话,可以的
利用队列层次遍历二叉树。
不断向下更新每一层的val,为当前层 val * 10 +下一层val
当当前结点左右子节点为空时,加到结果中/** * 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) { int res = 0; Deque<TreeNode> dq = new LinkedList<TreeNode>(); dq.offerLast(root); while(!dq.isEmpty()){ int k = dq.size(); while(k > 0){ --k; TreeNode node = dq.pollFirst(); if(node.left == null && node.right == null){ res += node.val; }else{ if(node.left != null){ node.left.val = node.val*10 + node.left.val; dq.offerLast(node.left); } if(node.right != null){ node.right.val = node.val*10 + node.right.val; dq.offerLast(node.right); } } } } return res; } } 时间复杂度 O(n)
- 空间复杂度 O(n)
