Sum Root to Leaf Numbers
Question
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.
Solution
自己是用 backtrack 來寫這題,用一個 StringBuilder 枚舉所有 root -> leaf,加完後再用 deleteCharAt。
public int sumNumbers(TreeNode root) {
        if (root == null) {
            return 0;
        }
        List<String> list = new ArrayList<String>();
        helper(root, list, new StringBuilder());
        int res = 0;
        for (String s : list) {
            res += Integer.parseInt(s);
        }
        return res;
    }
    public void helper(TreeNode t, List<String> temp, StringBuilder sb) {
        if (t == null) {
            return;
        } else if (t != null && t.left == null && t.right == null) {
            temp.add(sb.append(Integer.toString(t.val)).toString());
            sb.deleteCharAt(sb.length() - 1);
            return;
        }
        sb.append(Integer.toString(t.val));
        helper(t.left, temp, sb);
        helper(t.right, temp, sb);
        sb.deleteCharAt(sb.length() - 1);
    }
上面 code 的效率不好。參考解答的 recursion 十分漂亮,可以學一下。
public int sumNumbers(TreeNode root) {
    return sum(root, 0);
}
public int sum(TreeNode n, int s){
    if (n == null) return 0;
    if (n.right == null && n.left == null) return s*10 + n.val;
    return sum(n.left, s*10 + n.val) + sum(n.right, s*10 + n.val);
}
或參考這個
public class Solution {
    int total;
    public int sumNumbers(TreeNode root) {
        total = 0;
        helper(root, 0);
        return total;
    }
    void helper(TreeNode root, int sum) {
        if (root == null) return;
        sum = sum * 10 + root.val;
        if (root.left == null && root.right == null) {
            total += sum;
            return;
        }
        helper(root.left, sum);
        helper(root.right, sum);
    }
}