当前位置: 首页 > news >正文

迭代法求从根到叶的二进制数之和

迭代

我们用栈来模拟递归,同时使用一个 prev 指针来记录先前访问的节点。算法步骤如下:

我们用栈来模拟递归,同时使用一个 prev 指针来记录先前访问的节点。算法步骤如下:

如果节点 root 非空,我们将不断地将它及它的左节点压入栈中。

我们从栈中获取节点:

该节点的右节点为空或者等于 prev ,说明该节点的左子树及右子树都已经被访问,我们将它出栈。如果该节点是叶子节点,我们将它对应的数字 val 加入结果中。设置 prev 为该节点,设置 root 为空指针。

该节点的右节点非空且不等于 prev ,我们令 root 指向该节点的右节点。

3.如果 root 为空指针或者栈空,中止算法,否则重复步骤 1。

需要注意的是,每次出入栈都需要更新 val 。

代码

Python3

class Solution: def sumRootToLeaf(self, root: Optional[TreeNode]) -> int: ans = val = 0 st = [] pre = None while root or st: while root: val = (val << 1) | root.val st.append(root) root = root.left root = st[-1] if root.right is None or root.right == pre: if root.left is None and root.right is None: ans += val val >>= 1 st.pop() pre = root root = None else: root = root.right return ans

Java

class Solution { public int sumRootToLeaf(TreeNode root) { Deque<TreeNode> stack = new ArrayDeque<TreeNode>(); int val = 0, ret = 0; TreeNode prev = null; while (root != null || !stack.isEmpty()) { while (root != null) { val = (val << 1) | root.val; stack.push(root); root = root.left; } root = stack.peek(); if (root.right == null || root.right == prev) { if (root.left == null && root.right == null) { ret += val; } val >>= 1; stack.pop(); prev = root; root = null; } else { root = root.right; } } return ret; } }

C++

class Solution { public: int sumRootToLeaf(TreeNode* root) { stack<TreeNode *> st; int val = 0, ret = 0; TreeNode *prev = nullptr; while (root != nullptr || !st.empty()) { while (root != nullptr) { val = (val << 1) | root->val; st.push(root); root = root->left; } root = st.top(); if (root->right == nullptr || root->right == prev) { if (root->left == nullptr && root->right == nullptr) { ret += val; } val >>= 1; st.pop(); prev = root; root = nullptr; } else { root = root->right; } } return ret; } };

复杂度分析

  • 时间复杂度:O(n) ,其中 n 是节点数目。总共访问 n 个节点。
  • 空间复杂度:O(n) 。栈最多压入 n 个节点。
http://www.jsqmd.com/news/1116957/

相关文章:

  • XSS攻击深度解析:从原理到企业级防御实战
  • STM32与Si4732打造高保真数字收音机设计指南
  • 一线观察:GEO厂商的真实适配边界
  • Python+Pytest-BDD构建UI与API融合自动化测试框架实战
  • Dify 1.15人工介入功能详解:构建可控AI工作流实战
  • RTSPtoWeb架构解析:纯Go实现RTSP到Web流媒体的高性能转换方案
  • 当AI进入金融交易核心工作流,安全与高效协作如何并重?
  • AI Agent的自我进化:元认知与反思机制的实现
  • BiSheng JDK 17在大数据场景的应用:性能提升实战案例分享
  • 可靠性预计建模工作注意事项
  • 飞鹰控安卓远控源码仅供学习 已移除核心代码
  • 2026 年 11 月 10 日起微软停对 .NET 8 和 .NET 9 支持,建议升级到 .NET 10
  • 柔性制造技术升级:从批量生产到个性化定制,重构制造业生产底层模式
  • 政务信息化项目建设流程
  • 一人公司必备AI工具:降本90%,转化暴涨52%的秘诀
  • 【Java课程设计/毕业设计】基于 SpringBoot+Vue 的医院医疗器械管理系统医院医疗器械报废审批管理系统的设计与实现【附源码、数据库、万字文档】
  • Java自动化测试实战:从单元测试到接口测试的完整架构与最佳实践
  • 多数企业AI部署无效?拆解智能体落地核心逻辑,解锁60%成功者的底层打法
  • 2026 WAIC企业家论坛7月18日开启,共探AI驱动企业转型新路径
  • 谷歌人才流失市值蒸发,Gemini Spark能否挽救巨头“早出晚集”的尴尬局面?
  • WooCommerce拍卖插件 YITH Auctions 完整评测:功能、设置与实战 - 易服客工作室
  • 谷歌新应用 Dreambeans:实用有趣兼具,个性化 AI 让用户自主掌控信息体验!
  • Mind Elixir 思维导图导出功能深度解析与技术实现
  • Godot-CPP:解锁C++高性能游戏开发的终极指南
  • mac安装 python,LangChain----ai开发
  • 这一期讲一下佳能清零软件的问题,常见报错5B00,5B02,5B04,1700,1702,1704,P07,E08这些,其实这些故障只需有手就会修,哈哈。我用的是佳能V6.200原版清零软件,亲测完美
  • AI-Native潮玩品牌ZuzuZoos获数千万元Pre-A轮融资,差异化打造AI陪伴机器人!
  • 高校双重检测难落地?paperxie 分层降重降 AIGC 一站式化解论文修改痛点
  • 为什么AI最先冲击的,反而是看起来体面的办公室工作?
  • IS31FL3731与PIC18LF2685的LED矩阵驱动优化实践