题目描述:
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。 例如,从根到叶子节点路径 1->2->3 代表数字 123。 计算从根到叶子节点生成的所有数字之和。 说明: 叶子节点是指没有子节点的节点。 示例 1: 输入: [1,2,3] 1 / \ 2 3 输出: 25 解释: 从根到叶子节点路径 1->2 代表数字 12. 从根到叶子节点路径 1->3 代表数字 13. 因此,数字总和 = 12 + 13 = 25. 示例 2: 输入: [4,9,0,5,1] 4 / \ 9 0 / \ 5 1 输出: 1026 解释: 从根到叶子节点路径 4->9->5 代表数字 495. 从根到叶子节点路径 4->9->1 代表数字 491. 从根到叶子节点路径 4->0 代表数字 40. 因此,数字总和 = 495 + 491 + 40 = 1026.算法思想:此题整体框架类似于求二叉树所有从跟到叶子的路径,只是在这个基础上添加了计算所有路径和的操作。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void traverse(TreeNode* root,int &res,int &sum){ if(root==NULL) return ; sum=sum*10+root->val;//将当前根节点的值添加到路径和中 if(root->left==NULL&&root->right==NULL){//如果是叶子节点,说明一条完整的路径和已经得出 res+=sum; } traverse(root->left,res,sum);//遍历左子树 traverse(root->right,res,sum);//遍历右子树 sum=(sum-root->val)/10;//去除当前根节点的值,恢复到进入这条路径之前的状态 } int sumNumbers(TreeNode* root) { if(root==NULL) return 0; int res=0; int sum=0; traverse(root,res,sum); return res; } };