[LeetCode 129] - 根节点到叶子节点数字求和(Sum Root to Leaf Numbers)
2013-05-24 19:17
465 查看
问题
给定一个节点取值只包含数字0-9的二叉树,每条根节点至叶子节点的路径都可以表示一个数字。例如,根至叶子路径1->2->3表示数字123。
求所有根至叶子数字的和。
例如,
1
/ \
2 3
根至叶子路径1->2表示数字12
根至叶子路径1->3表示数字13
返回值sum=12+13=25
初始思路
要求和就必须把所有路径列出来,所以解决问题的核心就是要遍历所有根到叶子的路径。遍历二叉树容易想到通过递归访问左右子节点直到找到叶子,此时发现一条路径。所以递归结束的条件是当前节点为叶子节点,而一个叶子节点是没有子节点的,所以递归结束条件用代码表示为:root->left == 0 && root->right == 0一次递归结束时,需要知道路径中都包含了什么值以求出根至叶子数,因此我们需要一个容器记录本次都走过了哪些节点,这里使用一个std::list<int>。在递归访问过程中,每访问到一个节点,我们把当前节点的值放入容器尾部,而函数返回前把该值弹出以表示返回上一个节点。得到了一个路径中所有节点的值后就可以将其转为转为数字了。由于值都是按顺序放入容器的,所以从头到尾对容器中的每一个值执行 和 = 10 * 当前位置的值 + 和 的逻辑就可以算出该数字了。算出一条路径的数字后我们再将其累加到总和即可。
把上面的理论写成代码:
class Solution { public: int sumNumbers(TreeNode *root) { sum_ = 0; path_.clear(); if(root) { DoSum(root); } return sum_; } private: void DoSum(TreeNode *root) { path_.push_back(root->val); if(root->left == 0 && root->right == 0) { CountOnePath(); } else { if(root->left) { DoSum(root->left); } if(root->right) { DoSum(root->right); } } path_.pop_back(); } void CountOnePath() { int sum = 0; for(auto iter = path_.begin(); iter != path_.end(); ++iter) { sum = 10 * sum + *iter; } sum_ += sum; } int sum_; std::list<int> path_; };
提交后一次性Judge Small和Judge Large通过。看来本题并没有什么机关。
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【129-Sum Root to Leaf Numbers(全部根到叶子结点组组成的数字相加)】
- LeetCode 129 Sum Root to Leaf Numbers(递归求和)
- [LeetCode] Sum Root to Leaf Numbers 求根到叶节点数字之和
- 【LeetCode-面试算法经典-Java实现】【129-Sum Root to Leaf Numbers(所有根到叶子结点组组成的数字相加)】
- [Leetcode] Sum root to leaf numbers求根到叶节点的数字之和
- 129.leetcode Sum Root to Leaf Numbers(medium)[深度遍历DFS]
- [leetcode] #129 Sum Root to Leaf Numbers
- LeetCode 129:Sum Root to Leaf Numbers
- LeetCode129 Sum Root to Leaf Numbers
- [LeetCode129]Sum Root to Leaf Numbers
- LeetCode 129: Sum Root to Leaf Numbers
- leetcode_129_Sum Root to Leaf Numbers
- LeetCode 129 Sum Root to Leaf Numbers
- LeetCode 129 Sum Root to Leaf Numbers
- LeetCode(129) Sum Root to Leaf Numbers
- [LeetCode129]Sum Root to Leaf Numbers
- [LeetCode129] Sum Root to Leaf Numbers
- Leetcode[129]-Sum Root to Leaf Numbers
- [LeetCode]129 Sum Root to Leaf Numbers
- leetcode[129]Sum Root to Leaf Numbers