问题描述
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例:
思考过程
除了叶子节点能确定一定是个位以外其他节点都不能确定处于哪一位,因此必须从叶子节点开始往上算,因此我想到了前几天做的平衡二叉树的自底向上的做法,用一个参数times来记录目前节点的位数,但是经过思考和尝试,发现甚至连最初传进去的times应该设置为几都不知道;于是又换了一种思路,也许可以返回在第几层,用“层数”作为10的指数来与val相乘再相加,其实也是自底向上的思想,若为叶子节点则返回第0层,之后每向上返回一层层数就加一。感觉思想上是可以的,不过用代码实现的时候还是遇到了问题。
最后看的官方题解,深度优先搜索的方法,算法思想是:
用一个变量presum记录从上往下遍历时得到的和,每向下一层,presum就乘以10在加上当前节点的val,若遇到叶子节点则可返回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 Solution {
public:
int Sum(TreeNode* root,int presum){
if(root==NULL)
return 0;
int sum=presum*10+root->val;
if(root->left==NULL&&root->right==NULL){
return sum;
}else{
return Sum(root->left,sum)+Sum(root->right,sum);
}
}
int sumNumbers(TreeNode* root) {
return Sum(root,0);
}
};
心得
看了官方的题解之后我觉得还是没能熟练运用递归,甚至没有完全理解运用递归的思想,感觉做递归的感觉和做动态规划的感觉有点像,如果能想到突破点,那么思想和代码都比较简单,但如果想不到解题的突破点,还是难顶。