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

171 阅读1分钟

题目介绍

力扣129题:leetcode-cn.com/problems/su…

image.png

image.png

方法一

利用二叉树前序遍历,遍历的过程中累加节点值,计算完根节点之后进行回溯,代码如下:

class Solution {
    private int result = 0; 

    private StringBuilder temp = new StringBuilder();

    public int sumNumbers(TreeNode root) {
        if(root == null) {
            return 0;
        }
        traverseNumbers(root);
        return result;
    }

    public void traverseNumbers(TreeNode root) {
        if(root == null) {
            return;
        }
        temp.append(root.val + "");
        if(root.left == null && root.right == null) {
            result += Integer.valueOf(String.valueOf(temp));
        }
        traverseNumbers(root.left);
        traverseNumbers(root.right);
        //相当于回溯
        temp.deleteCharAt(temp.length() - 1);
    }
}

方法二:深度优先搜索

深度优先搜索是很直观的做法。从根节点开始,遍历每个节点,如果遇到叶子节点,则将叶子节点对应的数字加到数字之和。如果当前节点不是叶子节点,则计算其子节点对应的数字,然后对子节点递归遍历。

image.png

代码如下:

class Solution {
    public int sumNumbers(TreeNode root) {
        return dfs(root, 0);
    }

    public int dfs(TreeNode root, int prevSum) {
        if (root == null) {
            return 0;
        }
        int sum = prevSum * 10 + root.val;
        if (root.left == null && root.right == null) {
            return sum;
        } else {
            return dfs(root.left, sum) + dfs(root.right, sum);
        }
    }
}

复杂度分析

  • 时间复杂度:O(n),其中 nn 是二叉树的节点个数。对每个节点访问一次。

  • 空间复杂度:O(n),其中 nn 是二叉树的节点个数。空间复杂度主要取决于递归调用的栈空间,递归栈的深度等于二叉树的高度,最坏情况下,二叉树的高度等于节点个数,空间复杂度为 O(n)。