LeetCode题解——Sum Root to Leaf Numbers

来源:互联网 发布:条形码扫描枪软件 编辑:程序博客网 时间:2024/05/21 09:18

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.

思路:

对于每一个节点,从该节点到叶结点的path可能有多条,如果我们已经计算得到了该节点左子结点到叶结点的 root-to-leaf path sum,记为 sumleft ,以及该节点右子节点到叶结点的root-to-leaf path sum,记为 sumright , 那么我们怎样通过已知的这两个信息得到当前节点到叶结点的sum,是否还需要额外的信息呢?

答案是需要,首先我们需要知道当前节点(eg. p)到每个叶子节点的长度,这样我们知道当前节点p在这条路径上贡献的值应该为

 SUM(p->val*pow(10,di) ; di为每个叶子节点i到当前节点p的长度,这样当前节点p到叶结点的值就可以求出来了:

 sump = SUM(p->val*pow(10,di) + sumleft + sumright 

/** * 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 {public:    int sumNumbers(TreeNode* root) {        vector<int> d;        return sumNumbers(root,d);    }    int sumNumbers(TreeNode* root, vector<int> & d){        if(!root){            d.push_back(0);            return 0;        }        vector<int> d1,d2;        int s = 0;        if(!root->left && !root->right)  {d.push_back(0);return root->val;}        if(root->left)  s += sumNumbers(root->left,d1);        if(root->right) s += sumNumbers(root->right,d2);        for(auto j:d1){            d.push_back(j+1);        }        for(auto j:d2){            d.push_back(j+1);        }        for(auto i:d){            s+=root->val*pow(10,i);        }        return s;    }};


0 0