给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
[1,2,3] 根到叶子是 1-2与1-3 因此和是12+13=25
这题也是leetcode上面的129题
二叉树的操作一般是递归+回溯
我比较喜欢的写法是(因为很多递归问题传入参数就是引用)
class Solution {
private:
void get(TreeNode* root,int &temp,int &sum)
{
if(root==NULL)//刚开始是空节点时
{
return;
}
if(root->left==NULL&&root->right==NULL)
{
temp=temp*10+root->val;
cout<<temp<<endl;
sum=sum+temp;
temp=(temp-root->val)/10;
return ;
}
temp=temp*10+root->val;//这个一定要注意,回溯过程
get(root->left, temp, sum);
get(root->right, temp, sum);
temp=(temp-root->val)/10;//回溯
return;
}
public:
int sumNumbers(TreeNode* root) //temp 代表之间节点的值
{
int sum=0;
int temp=0;
get(root,temp,sum);
return sum;
}
};
里面可以发现 temp采用引用方式比较麻烦,我们也可以不用temp的引用
代码为
/**
* 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 {
private:
void get(TreeNode* root,int temp,int &sum)
{
if(root==NULL)//刚开始是空节点时
{
return;
}
if(root->left==NULL&&root->right==NULL)
{
temp=temp*10+root->val;
cout<<temp<<endl;
sum=sum+temp;
return ;
}
temp=temp*10+root->val;
get(root->left, temp, sum);
get(root->right, temp, sum);
return;
}
public:
int sumNumbers(TreeNode* root) //temp 代表之间节点的值
{
int sum=0;
int temp=0;
get(root,temp,sum);
return sum;
}
};
会发现不加引用的话就是
temp=(temp-root->val)/10;//这行删除了,但是要明白里面究竟发生了什么,引用就是别名,引用改变,原值也会改变的。