129. 求根节点到叶节点数字之和

深度优先搜索

class Solution {
    public int sumNumbers(TreeNode root) {

        List<String> list = convertStr(root);

        int sum = 0;

        /**
         * Integer.parseInt()将字符串转为整型
         */
        for (int i = 0; i < list.size(); i++) {
            sum += Integer.parseInt(list.get(i));
        }

        return sum;
    }

    public List<String> convertStr(TreeNode root){

        List<String> list = new LinkedList<>();

        /**
         * 空节点返回空列表
         */
        if (root == null){
            return list;
        }

        /**
         * 如果是叶子节点,将数值转换为字符串加入列表
         */
        if (root.left == null && root.right == null){

            list.add(Integer.toString(root.val));
            return list;
        }

        List<String> left = convertStr(root.left);
        List<String> right = convertStr(root.right);

        for (int i = 0; i < left.size(); i++) {
            list.add(root.val + left.get(i));
        }

        for (int i = 0; i < right.size(); i++) {
            list.add(root.val + right.get(i));
        }

        return list;
    }
}

/**
 * 时间复杂度 O(n^2)
 * 空间复杂度 O((logn)^2)
 */

优化1——直接存储数值

class Solution {
    public int sumNumbers(TreeNode root) {

        return sumNumbers(root, 0);
    }

    public int sumNumbers(TreeNode root, int sum){

        /**
         * 空节点返回0
         */
        if (root == null){
            return 0;
        }

        sum = root.val + sum * 10;
        
        /**
         * 如果是叶子节点,将数值再加上前面的结果乘以10
         */
        if (root.left == null && root.right == null){
            return sum;
        }

        return sumNumbers(root.left, sum) + sumNumbers(root.right, sum);
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(logn)
 */

https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/

posted @ 2021-12-25 23:54  振袖秋枫问红叶  阅读(29)  评论(0)    收藏  举报