「思路」
用a,b分别记录右子树和左子树当前的值,在root没有左右子树时,将最终取得的a或b的值加给ans。当仅有右子树时,a在加上当前root的值和从上一层传递来的数据(由于不知道上一层是从a还是b传来的,所以a,b都要加上),再*10。指针向右子树继续向下传递(注意,仅从右子树向下传递时,b要清0,以防重复计算)。同理的仅有左子树的情况。当左右子树都有时,a b都要重新用以上方法计算。
「运行结果」
class Solution {
public:
int ans=0;
int sumNumbers(TreeNode* root) {
if(!root) return ans;
sumnum(root,0,0);
return ans;
}
void sumnum(TreeNode* root,int a,int b)
{
if(!root->left && !root->right)
{
ans=ans+a+b+root->val;
return;
}
else if(!root->left && root->right)
{
a=(a+b+root->val)*10;
sumnum(root->right,a,0);
}
else if(root->left && !root->right)
{
b=(b+a+root->val)*10;
sumnum(root->left,0,b);
}
else
{
int i=a;
a=(a+b+root->val)*10;
b=(i+b+root->val)*10;
sumnum(root->left,0,b);
sumnum(root->right,a,0);
}
}
};
完成之后,继续去看了leetcode上更加简洁的算法,自己也按照同样的思路做了一遍,这种算法虽然时间上没有提升,但是代码量减少了也算是一种进步,如下:
class Solution {
public:
int sumNumbers(TreeNode* root) {
return sumnum(root,0);
}
int sumnum(TreeNode* root,int ans)
{
if(!root) return 0;
if(!root->left && !root->right)
{
return ans+root->val;
}
int temp=(ans+root->val)*10;
return sumnum(root->left,temp)+sumnum(root->right,temp);
}
};
下一种是leetcode上运行最快的代码,作为借鉴,如下:
class Solution {
public:
void digui(TreeNode * root, int temp)
{
if (root->left == NULL && root->right == NULL)
{ans+=temp;return;}
if (root->left)
{
digui(root->left,temp*10+root->left->val);
}
if (root->right)
{
digui(root->right,temp*10+root->right->val);
}
return ;
}
int sumNumbers(TreeNode* root)
{
ans = 0;
if (root == NULL)
return ans;
digui(root,root->val) ;
return ans;
}
int ans;
};