【leetcode】129. Sum Root to Leaf Numbers

【leetcode】129. Sum Root to Leaf Numbers_第1张图片
「思路」
用a,b分别记录右子树和左子树当前的值,在root没有左右子树时,将最终取得的a或b的值加给ans。当仅有右子树时,a在加上当前root的值和从上一层传递来的数据(由于不知道上一层是从a还是b传来的,所以a,b都要加上),再*10。指针向右子树继续向下传递(注意,仅从右子树向下传递时,b要清0,以防重复计算)。同理的仅有左子树的情况。当左右子树都有时,a b都要重新用以上方法计算。
「运行结果」
【leetcode】129. Sum Root to Leaf Numbers_第2张图片

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;
};

你可能感兴趣的:(2017-8)