思路:
本题的核心在于遍历二叉树的所有节点,但不同于普通遍历的是应以遍历路径的方式进行数的遍历。所以也可以理解为遍历二叉树的所有路径,然后对计算路径的和。所以可使用回溯的方法进行遍历。
class Solution
{
private:
vector<int> path;
int res = 0;
/********************************************************************************
*函数功能:将数组中的路径的数字转换为路径和
*入参:待操作的数组
*出参:无
*返回值:路径和
********************************************************************************/
int vectorToint(vector<int> &nums)
{
int sum = 0;
if(nums.empty())
{
return 0;
}
for(auto temp : nums)
{
sum = sum*10 + temp;//计算所有路径和
}
return sum;
}
/********************************************************************************
*函数功能:使用回溯的方法收集二叉树的所有路径
*入参:二叉树节点
*出参:无
*返回值:无(使用全局变量收集路径和)
********************************************************************************/
void traversal(TreeNode* cur)
{
if(!cur->left && !cur->right)//当前节点为子节点
{
res += vectorToint(path);//收集该路径的值
return ;
}
if(cur->left)//左子节点
{
path.push_back(cur->left->val);//收集该节点的值
traversal(cur->left);//递归 到下一节点
path.pop_back();//回溯
}
if(cur->right)
{
path.push_back(cur->right->val);
traversal(cur->right);
path.pop_back();
}
return ;
}
public:
/********************************************************************************
*函数功能:使用回溯的方法收集二叉树的所有路径和
*入参:二叉树的根节点
*出参:无
*返回值:二叉树的所有路径和
********************************************************************************/
int sumNumbers(TreeNode* root)
{
if(root == nullptr)
{
return 0;
}
path.push_back(root->val);
traversal(root);
return res;
}
};```