题解 | #二叉树根节点到叶子节点的所有路径和#

二叉树根节点到叶子节点的所有路径和

http://www.nowcoder.com/practice/185a87cd29eb42049132aed873273e83

算法思想一:深度优先搜索

解题思路:

二叉树的每条从根节点到叶子节点的路径都代表一个数字。其实,每个节点都对应一个数字,等于其父节点对应的数字乘以 10 再加上该节点的值(这里假设根节点的父节点对应的数字是 0)。只要计算出每个叶子节点对应的数字,然后计算所有叶子节点对应的路径之和,即可得到结果

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

代码展示:

Python版本
class Solution:
    def sumNumbers(self , root ):
        # write code here
        def dfs(root, prevTotal):
            if not root:
                return 0
            total = prevTotal * 10 + root.val
            if not root.left and not root.right:
                # 到达叶子结点,返回结果
                return total
            else:
                # 对左右子树进行递归
                return dfs(root.left, total) + dfs(root.right, total)
        # 深度搜索
        return dfs(root, 0)

复杂度分析:

时间复杂度:O(N),其中 N 是二叉树的节点个数。对每个节点访问一次。
空间复杂度:O(N),其中 N 是二叉树的节点个数。空间复杂度主要取决于递归调用的栈空间,递归栈的深度等于二叉树的高度,最坏情况下,二叉树的高度等于节点个数,空间复杂度为 O(N)。

算法思想二:深度优先搜索

解题思路:

使用广度优先搜索,需要维护两个队列,分别存储节点和节点对应的数字。
1、初始时,将根节点和根节点的值分别加入两个队列。每次从两个队列分别取出一个节点和一个数字,进行如下操作:
如果当前节点是叶子节点,则将该节点对应的数字加到路径之和;
如果当前节点不是叶子节点,则获得当前节点的非空子节点,并根据当前节点对应的数字和子节点的值计算子节点对应的数字,然后将子节点和子节点对应的数字分别加入两个队列。
2、搜索结束后,即可得到所有叶子节点对应的路径之和。
图解:

代码展示:

JAVA版本
public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    public int sumNumbers (TreeNode root) {
        // write code here
        if (root == null) {
            return 0;
        }
        int sum = 0;
        // 定义结点队列
        QueuenodeQueue = new LinkedList();
        // 定义到达该结点时 数字 队列
        QueuenumQueue = new LinkedList();
        // 根节点先进队列
        nodeQueue.offer(root);
        numQueue.offer(root.val);
        while (!nodeQueue.isEmpty()) {
            TreeNode node = nodeQueue.poll();
            int num = numQueue.poll();
            TreeNode left = node.left, right = node.right;
            if (left == null && right == null) {
                sum += num;
            } else {
                if (left != null) {
                    nodeQueue.offer(left);
                    numQueue.offer(num * 10 + left.val);
                }
                if (right != null) {
                    nodeQueue.offer(right);
                    numQueue.offer(num * 10 + right.val);
                }
            }
        }
        return sum;
    }
}

复杂度分析:

时间复杂度:O(N),其中 N 是二叉树的节点个数。对每个节点访问一次。
空间复杂度:O(N),其中 N 是二叉树的节点个数。空间复杂度主要取决于队列,每个队列中的元素个数不会超过 N



全部评论

相关推荐

家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
点赞 评论 收藏
分享
06-11 13:34
门头沟学院 C++
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
06-26 18:30
门头沟学院 Java
据说名字越长别人越关注你的昵称我觉得我要被关注了:你问问这里面有多少是正经候选人,而不是乱打招呼的
点赞 评论 收藏
分享
评论
8
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务