题目:Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.
1 / 2 3
Return the sum = 12 + 13 = 25
.
思路:递归
首先有好几种思路,本程序写的是从顶端到本结点的一个sum值,非所有的。也可以写一个代表所有的sum总和值得。
代码2很巧妙的,用了一个全局变量sum,函数递归调用很不错。值得参考。
两种方法:
>1、
sumHelper(TreeNode *root,int sum),
首先判断本节点是否为空,为空直接返回0,接着开始计算,注意,这里的sum是指从根节点到此节点的上一个节点的sum之和
再者就是判断两个孩子是否都为空
所以最后的函数递归调用sumHelper(root->left,sum)+sumHelper(root->right,sum);
>2、
深搜。
首先判断是否到左右孩子均没有的情况,sum是一个全局变量,此时,我先搜索到最深节点,注意递归内容:10*num+root->left->val
这就是本条路径的所有行进到此节点的sum和,然后我再判断是否左右节点存在,继续用sum分别加上左杰节点内容,而不会改变值大小。
代码:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution1 { public: int sumNumbers(TreeNode* root) { return sumHelper(root,0); } int sumHelper(TreeNode *root,int sum){ if(root==NULL){ return 0; } sum=sum*10+root->val; if(root->left==NULL&&root->right==NULL){ return sum; } //这个sum应该是代表从顶端到此刻结点的总和。 return sumHelper(root->left,sum)+sumHelper(root->right,sum); } };
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution2 { public: int sum=0; int sumNumbers(TreeNode* root) { int result=0; if(root==NULL){ return 0; } dfs(root,root->val); return sum; } int dfs(TreeNode *root,int num){ if(root->left==NULL&&root->right==NULL){ sum+=num;//这个时候是总和 } if(root->left!=NULL){ dfs(root->left,10*num+root->left->val); } if(root->right!=NULL){ dfs(root->right,10*num+root->right->val); } } };