【leetcode】Sum Root to Leaf Numbers(hard)

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.

An example is the root-to-leaf path 1->2->3 which represents the number 123.

Find the total sum of all root-to-leaf numbers.

For example,

    1

   / \

  2   3

 

The root-to-leaf path 1->2 represents the number 12.
The root-to-leaf path 1->3 represents the number 13.

Return the sum = 12 + 13 = 25.

 

思路:最近睡得不好,搞得脑子也短路了。一直想着怎么从叶节点往上获取数字。费了好大的劲才AC了,结果一看答案,立马郁闷了。不到10行就能搞定。

具体的原理是深度优先,在向下迭代的过程中,用一个变量不断的把父节点以上的数字传下来,返回的时候把结果加起来。

public int sumNumbers(TreeNode root) {

        return helper(root, 0);

}



public int helper(TreeNode root, int curSum) {

        if(root == null) return 0;

        curSum = curSum*10 + root.val;

        if(root.left == null && root.right == null) return curSum;

        return helper(root.left, curSum) + helper(root.right, curSum);

}

 

 

下面是我自己AC的代码,超长,超繁琐,当个反面例子吧。思路是把每个数字都存在一个vector里面。之所以繁琐是因为我只是在返回的时候下功夫。

int sumNumbers(TreeNode *root) {

        int s, e, sum = 0;

        vector<vector<int>> v;

        Numbers(root, s, e, v);

        for(vector<vector<int>>::iterator it = v.begin(); it != v.end(); ++it)

        {

            int num = 0;

            while(!it->empty())

            {

                num = num * 10 + it->back();

                it->pop_back();

            }

            sum += num;

        }

        return sum;

    }



    void Numbers(TreeNode * root, int &s, int &e, vector<vector<int>>& v)

    {

        int sl = -1, el = -1, sr = -1, er = -1;

        s = e = -1;

        if(root == NULL) return;

        if(root->left == NULL && root->right == NULL) //在叶节点 压入新的数字

        {

            e = s = v.size();

            v.push_back(vector<int>(1,root->val));

            return;

        }

        if(root->left != NULL)

        {

            Numbers(root->left, sl, el, v);

            for(int i = sl; i <= el; ++i)

            {

                v[i].push_back(root->val);

            }

            s = sl; e = el;

        }

        if(root->right != NULL)

        {

            Numbers(root->right, sr, er, v);

            for(int i = sr; i <= er; ++i)

            {

                v[i].push_back(root->val);

            }

            s = (s == -1) ? sr : s;

            e = er;

        }

    }

 

你可能感兴趣的:(LeetCode)