描述
给定一个仅包含数字0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。例如根节点到叶子节点的一条路径是1→2→3,那么这条路径就用123 来代替。找出根节点到叶子节点的所有路径表示的数字之和
例如:
这颗二叉树一共有两条路径,根节点到叶子节点的路径 1→2 用数字 12 代替,根节点到叶子节点的路径 1→3 用数字13 代替
所以答案为+13=25 12+13=25
示例1
输入:{1,0}
返回值:10
示例2
输入:{1,#,9}
返回值:19
在遍历的过程中计算根节点到叶节点的所有路径和。
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型
*/
int sum=0,path=0;
int sumNumbers(TreeNode* root) {
// write code here
dfs(root);
return sum;
}
void dfs(TreeNode* root)
{
if(!root) return;
path=path*10+root->val;
if(!root->left&&!root->right) sum+=path;//在遍历到叶子节点的时候会进行该操作
dfs(root->left);
dfs(root->right);
path/=10; //遍历完左子树后,计算右子树需要保留根节点的值,右子树的值要抛弃
}
};
LeetCode 129. 求根节点到叶节点数字之和
需要注意的是遍历是从上到下遍历,遍历过程中计算从根节点到叶子节点的路径和 t ,如果到达叶子节点
递归是从下到上递归,将左右两棵子树求和,直到返回到根节点为止。
class Solution {
public:
int sumNumbers(TreeNode* root) {
return dfs(root,0);
}
int dfs(TreeNode* root,int presum)
{
if(!root) return 0; //根节点为空,返回0
int t=presum*10+(root==nullptr?0:root->val);//计算从根节点到当前节点的值
auto left=dfs(root->left,t);
auto right=dfs(root->right,t);
if(root->left==nullptr && root->right==nullptr) return t;//如果遍历到叶子节点就可以直接返回t
return left+right;
}
};