Sum Root to Leaf Numbers
2 days
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
.
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int sumNumbers(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(root==NULL) return 0;
return sumRec(root, 0);
}
private:
int sumRec(TreeNode *root, int presum) {
int x = presum*10 + root->val;
if(root->left==NULL && root->right==NULL) {
return x;
}
if(root->left==NULL) {
return sumRec(root->right, x);
}
if(root->right==NULL) {
return sumRec(root->left, x);
}
return sumRec(root->left, x) + sumRec(root->right, x);
}
};
wrong try. bottom up. should use top bottom
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int sumNumbers(TreeNode root) {
// Start typing your Java solution below
// DO NOT write main() function
if(root==null) return 0;
Pair pair = sumRec( root);
return pair.first;
}
private Pair sumRec(TreeNode root) {
if(root==null) {
return new Pair(-1,0);
}
Pair left = sumRec(root.left);
Pair right = sumRec(root.right);
int x = root.val;
int l = 0, r=0;
if(left.first!=-1) {
l = (int)(root.val * Math.pow(10,left.second)) + left.first;
} else {
l = 0;
}
if(right.first !=-1) {
r = (int)(root.val * Math.pow(10,right.second)) + right.first;
} else {
r = 0;
}
return new Pair( l+r, (left.second>right.second ? left.second+1 : right.second+1) );
}
static class Pair{
public int first;
public int second;
public Pair(int x, int y) {first=x; second=y;}
}
}
correct one:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int sumNumbers(TreeNode root) {
// Start typing your Java solution below
// DO NOT write main() function
return sumRec(root, 0);
}
private int sumRec(TreeNode root, int num) {
if(root==null) {
return 0;
}
num = num*10 + root.val;
int left=0, right=0;
if(root.left!=null) left = sumRec(root.left, num);
if(root.right!=null) right = sumRec(root.right, num);
int res = left + right;
return res==0? num : res;
}
}
final version:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public int sumNumbers(TreeNode root) { // Start typing your Java solution below // DO NOT write main() function if(root==null) return 0; return sumRec(root, 0) ; } private int sumRec(TreeNode root, int parentSum) { int x = parentSum*10 + root.val; int l=0, r=0; if(root.left!=null) { l = sumRec(root.left, x); } if(root.right!=null) { r = sumRec(root.right, x); } if( l==0 && r==0) return x; else return l+r; } }