【Leetcode】563. Binary Tree Tilt

本文介绍了三种计算二叉树中每个节点左右子树节点和差的方法:递归加全局变量、双递归和后续非递归遍历加字典。通过实例详细解析了每种方法的实现过程和优缺点。

在这里插入图片描述
求每个节点左右子树节点和差

方法1 递归+全局变量

求出每个节点下的节点和即可

class Solution1:
    def findTilt(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        self.res = 0
        self.getSum(root)
        return self.res

    def getSum(self, root):
        if root == None:
            return 0
        left = self.getSum(root.left)
        right = self.getSum(root.right)
        self.res += abs(left - right)
        return root.val + left + right
方法2 双递归
class Solution2:
    def findTilt(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if root == None:
            return 0
        l =  self.getSum(root.left)
        r =  self.getSum(root.right)
        return abs(l - r) + self.findTilt(root.left) + self.findTilt(root.right)

    def getSum(self, root):
        if root == None:
            return 0
        l = self.getSum(root.left)
        r = self.getSum(root.right)
        return l + r + root.val
方法3 后续非递归遍历+dict

当前节点的和等于当前节点的值加左右节点的和,这是个自下而上的过程,用字典存储每个节点的和,然后上层节点就能通过字典查找到左右节点的和。

class Solution3:
    def findTilt(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        from collections import  defaultdict
        dictionary = defaultdict(int)
        stack = []
        pNode = root
        res = 0
        prev = None
        while(len(stack) or pNode):
            if pNode:
                stack.append(pNode)
                pNode = pNode.left
            else:
                pNode = stack[-1]
                if pNode.right == None or pNode.right == prev:
                    res += abs(dictionary[pNode.left] - dictionary[pNode.right])
                    dictionary[pNode] = pNode.val + dictionary[pNode.left] + dictionary[pNode.right]
                    prev = pNode
                    stack.pop()
                    pNode = None
                else:
                    pNode = pNode.right
        return res
内容概要:本文详细介绍了一个基于Transformer-GRU-Adaboost的智能故障诊断项目实例,提出了一种融合Transformer编码器、门控循环单元(GRU)和Adaboost自适应增强算法的混合模型架构。该模型通过Transformer提取输入信号的全局特征,利用GRU捕捉时序演化规律,并借助Adaboost集成多个弱分类器以提升模型鲁棒性与泛化能力,实现对工业设备多类型、多层级复杂故障的高精度识别。文中涵盖了项目背景、目标意义、关键技术挑战及解决方案,并给出了数据预处理、特征提取、模型训练与实时推理的完整流程及部分Python代码示例,展示了从数据采集到在线监控的端到端系统设计。; 适合人群:具备一定机器学习与深度学习基础,从事工业智能诊断、设备健康管理、AI算法开发等相关领域的研究人员、工程师及高校研究生;熟悉Python和PyTorch框架者更佳; 使用场景及目标:①应用于旋转机械、电机、泵阀等工业设备的故障诊断与状态监测;②解决实际工业中样本不平衡、噪声干扰、实时性要求高等难题;③构建高鲁棒、可扩展的智能运维系统,支持预测性维护与实时预警; 阅读建议:此资源结合理论模型与代码实践,建议读者在理解Transformer、GRU和Adaboost基本原理的基础上,结合所提供的代码片段进行调试与扩展,深入掌握多模态融合建模与工业AI落地的关键技术细节。
【源码免费下载链接】:https://renmaiwang.cn/s/yfs7q 在MongoDB中,确保用户账户的安全性及访问权限是数据库管理员的职责所在。本文将详细阐述了两种安全且正确的MongoDB用户密码修改方法。首先让我们了解为何直接更新`system.users`表并非最佳实践。MongoDB存储用户信息于`system.users`集合内其中包括用户名、只读权限和认证信息等元素。若直接通过`update`操作更改密码字段(如`pwd`),新密码将以明文形式存入数据库这违背了安全原则因为密码应储存在哈希或加密格式中以防止数据泄露。**方法一:采用db.createUser命令尽管db.createUser常用于创建新用户但当指定相同用户名不同密码时它实际上可更新现有用户的密码。例如:```shelldb.createUser(tank2, 111)``` 在上述示例中若已存在用户名为`tank2`的记录则该命令将更改为密码`111`且新密码将以哈希形式存入数据库确保安全性。**方法二:利用db.changeUserPassword命令此指令专为用户密码修改设计允许安全可靠地更改用户的登录信息例如:```shelldb.changeUserPassword(tank2, test)``` 该操作将更改`tank2`用户名的密码至`test`并以加密方式存储新密码。值得注意的是执行上述命令需确保拥有相应的权限通常由root用户或具备`userAdminAnyDatabase`角色的用户持有此外从MongoDB 3.6版本起db.createUser和db.removeUser被推荐取代db.addUser和db.removeUser以保持与最新版本的兼容性。 在实际操作过程中除了正确修改密码还需定期更新密码并确保数据库拥有严格的访问控制策略包括但不限于用户名权限分配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值