leetcode: Sum Root to Leaf Numbers

本文介绍了一种解决LeetCode题目“路径之和”的有效算法,通过遍历二叉树并计算从根节点到叶子节点的所有路径值之和。采用队列辅助存储中间节点值,确保每个叶子节点对应的数值能被正确计算。

问题描述:

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.

原问题链接:https://leetcode.com/problems/sum-root-to-leaf-numbers/

 

问题分析

  这个问题的要求比较有意思,因为它要计算所有从根到叶节点构成的值,并且要将它们所有的和计算出来。从根节点到叶节点的过程相当于一个10进制的过程,每下一层,就对前面的值乘以十再加上当前层的值。

  那么在实现中我们就需要想办法求到从根节点到叶节点最终形成的值。对树中间任意节点来说,我们就需要有一个对应的位置保存有到这个节点的值,然后对于它的子节点就可以用这个当前值再乘以十再相加了。为了得到这最终形成的值,我们需要对树做一个遍历,这样才能保证覆盖到所有的节点。在遍历的过程中,我们判断出所有左右子树节点都为空的节点才算是叶节点。现在的问题就是要选择哪种树遍历的方法了。我们可以选择树的层次化遍历方法,用一个队列,不断的将队列里的元素取出来,然后将它所有存在的子节点加入到队列中。前面也提到过,对应的节点也需要有一个对应的值,我们可以用另外一个队列和它同步的保存对应的值。这样每次从节点队列里取元素出来的时候,我们也取对应的值队列里的元素。如果当前节点的左右子树为空,则它符合条件,我们将它累加到一个全局的变量中。如果它有非空的节点,则将这个节点对应的值乘以十再加那个节点的值,并将这个值加入到值队列中。

  按照这个思路,我们得到的详细实现如下:

 

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public int sumNumbers(TreeNode root) {
        if(root == null) return 0;
        int sum = 0;
        Queue<Integer> numQueue = new LinkedList<>();
        Queue<TreeNode> nodeQueue = new LinkedList<>();
        numQueue.add(root.val);
        nodeQueue.add(root);
        while(!nodeQueue.isEmpty()) {
            TreeNode node = nodeQueue.remove();
            int num = numQueue.remove();
            if(node.left == null && node.right == null) {
                sum += num;
                continue;
            }
            if(node.left != null) {
                nodeQueue.add(node.left);
                numQueue.add(num * 10 + node.left.val);
            }
            if(node.right != null) {
                nodeQueue.add(node.right);
                numQueue.add(num * 10 + node.right.val);
            }
        }
        return sum;
    }
}

 

【事件触发一致性】研究多智能体网络如何通过分布式事件驱动控制实现有限时间内的共识(Matlab代码实现)内容概要:本文围绕多智能体网络中的事件触发一致性问题,研究如何通过分布式事件驱动控制实现有限时间内的共识,并提供了相应的Matlab代码实现方案。文中探讨了事件触发机制在降低通信负担、提升系统效率方面的优势,重点分析了多智能体系统在有限时间收敛的一致性控制策略,涉及系统模型构建、触发条件设计、稳定性与收敛性分析等核心技术环节。此外,文档还展示了该技术在航空航天、电力系统、机器人协同、无人机编队等多个前沿领域的潜在应用,体现了其跨学科的研究价值和工程实用性。; 适合人群:具备一定控制理论基础和Matlab编程能力的研究生、科研人员及从事自动化、智能系统、多智能体协同控制等相关领域的工程技术人员。; 使用场景及目标:①用于理解和实现多智能体系统在有限时间内达成一致的分布式控制方法;②为事件触发控制、分布式优化、协同控制等课题提供算法设计与仿真验证的技术参考;③支撑科研项目开发、学术论文复现及工程原型系统搭建; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注事件触发条件的设计逻辑与系统收敛性证明之间的关系,同时可延伸至其他应用场景进行二次开发与性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值