首页/新闻资讯/正文详情

二叉树硬币分配算法:后序遍历与递归解法

发布时间:2026/11/5 7:15:37 来源:云帆数科 栏目:资讯中心
二叉树硬币分配算法:后序遍历与递归解法
1. 问题理解与解法思路这道题目要求我们在二叉树中重新分配硬币使得每个节点恰好有1枚硬币。我们可以通过递归遍历二叉树来解决这个问题。关键在于理解每个节点的过载量即该节点的硬币数与1的差值以及如何将这些过载量向上传递。1.1 问题重述给定一个二叉树的根节点其中每个节点的值表示该节点上的硬币数量。总硬币数等于树中的节点数。我们需要移动硬币使得每个节点恰好有1枚硬币。每次移动可以将一枚硬币从一个节点移动到其相邻节点父节点或子节点。要求计算完成分配所需的最少移动次数。1.2 解题思路后序遍历我们需要先处理子节点再处理父节点因此采用后序遍历。计算过载量对于每个节点计算其过载量当前硬币数 - 1。累加移动次数移动次数等于左右子节点过载量的绝对值之和。向上传递过载量将当前节点的过载量包括自身和子节点的传递给父节点。2. 代码实现与解析2.1 数据结构定义首先定义二叉树节点的结构/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */2.2 递归函数设计我们设计一个递归函数distributeCoinsHelper来计算移动次数int distributeCoinsHelper(struct TreeNode* root, int* moves) { if (root NULL) { return 0; } // 递归计算左右子树的过载量 int left distributeCoinsHelper(root-left, moves); int right distributeCoinsHelper(root-right, moves); // 累加移动次数 *moves abs(left) abs(right); // 返回当前节点的过载量包括子节点的 return root-val left right - 1; }2.3 主函数实现主函数distributeCoins初始化移动次数并调用辅助函数int distributeCoins(struct TreeNode* root) { int moves 0; distributeCoinsHelper(root, moves); return moves; }3. 算法复杂度分析3.1 时间复杂度我们遍历了树中的每个节点一次因此时间复杂度为O(N)其中N是树中的节点数。3.2 空间复杂度空间复杂度取决于递归调用的栈深度。最坏情况下树退化为链表空间复杂度为O(N)平衡树情况下为O(logN)。4. 示例解析4.1 示例1输入3 / \ 0 0过程左子树过载量0 - 1 -1右子树过载量0 - 1 -1根节点过载量3 (-1) (-1) - 1 0移动次数|-1| |-1| 24.2 示例2输入0 / \ 3 0过程左子树过载量3 - 1 2右子树过载量0 - 1 -1根节点过载量0 2 (-1) - 1 0移动次数|2| |-1| 35. 边界条件与注意事项5.1 边界条件空树应该返回0。单节点树如果节点值已经是1返回0否则返回|val - 1|。所有节点初始值为1应该返回0。5.2 注意事项递归终止条件处理NULL节点时返回0。移动次数累加使用指针或全局变量来累加移动次数。过载量计算记得减去1来计算当前节点的过载量。6. 优化与变种6.1 迭代解法虽然递归解法简洁但也可以使用迭代的后序遍历来实现int distributeCoinsIterative(struct TreeNode* root) { // 使用栈实现迭代后序遍历 // 代码略... }6.2 扩展问题最小移动路径不仅计算最小移动次数还要记录具体的移动路径。加权移动不同方向的移动可能有不同的代价求最小总代价。7. 常见错误与调试技巧7.1 常见错误忘记累加移动次数只计算了过载量但忘记累加移动次数。错误计算过载量忘记减去1来计算当前节点的过载量。指针使用错误在递归函数中错误地传递移动次数的指针。7.2 调试技巧打印调试在递归函数中打印当前节点值和过载量。小规模测试先用简单的树结构测试代码。边界测试测试空树、单节点树等边界情况。8. 实际应用场景这种硬币分配问题在实际中有多种应用资源分配在分布式系统中平衡各节点的负载。库存管理在仓库网络中平衡各仓库的库存。网络流量控制在网络节点间平衡流量。9. 类似题目推荐LeetCode 968. Binary Tree Cameras类似的后序遍历问题。LeetCode 337. House Robber III树形DP问题。LeetCode 124. Binary Tree Maximum Path Sum路径相关问题。10. 个人实现心得在实际实现过程中我发现理解过载量的概念是关键。最初我尝试记录每个节点的硬币移动方向后来发现只需要计算过载量的绝对值之和即可。这提醒我在解决树问题时应该多考虑如何通过递归传递必要的信息而不是试图记录所有细节。另一个收获是认识到后序遍历非常适合这类需要先处理子节点再处理父节点的问题。这种遍历顺序自然地允许我们将子节点的信息汇总到父节点从而自底向上地解决问题。

相关推荐

网络安全运维学习路线:从零基础到专业进阶
网络安全运维学习路线:从零基础到专业进阶

1. 网络安全运维学习路线解析作为一名在网络安全行业摸爬滚打十年的老兵,我见过太多转行者因为学习顺序错误而浪费时间和精力。今天我就来分享一套经过实战验证的网络安全运维学习路线,帮助零基础的朋友少走弯路。1.1 为什么学习顺序如此重要网络安全运维… · 2026/11/5 7:15:37

商业航天与卫星通信技术解析及应用场景
商业航天与卫星通信技术解析及应用场景

1. 商业航天与卫星通信行业概述2000年初,我参与第一个卫星地面站建设项目时,商业航天还只是各国航天局的专属领域。如今SpaceX的猎鹰火箭已实现常态化回收,OneWeb和星链正在近地轨道展开激烈竞争——这个曾经由国家主导的行业,正在… · 2026/11/5 7:14:37

1756SIL2认证解析:工业PLC功能安全的工程落地指南
1756SIL2认证解析:工业PLC功能安全的工程落地指南

简介:本资源为罗克韦尔自动化(Rockwell Automation)ControlLogix系列PLC于2021年获得的IEC 61508:2010 SIL2功能安全认证官方文件,面向工业自动化工程师、安全系统设计人员及PLC应用开发者,用于验证设备在安全关键场景… · 2026/11/5 7:14:37

5 分钟跑通 Locale-Emulator:让任意程序以你想的语言启动
5 分钟跑通 Locale-Emulator:让任意程序以你想的语言启动

5 分钟跑通 Locale-Emulator:让任意程序以你想的语言启动 【免费下载链接】Locale-Emulator Yet Another System Region and Language Simulator 项目地址: https://gitcode.com/gh_mirrors/lo/Locale-Emulator Locale-Emulator 是一款开源的 Windows 区域与… · 2026/11/5 7:46:49

从 CSV 到图表:Pandas 数据处理与 Matplotlib 可视化上手实践
从 CSV 到图表:Pandas 数据处理与 Matplotlib 可视化上手实践

从 CSV 到图表:Pandas 数据处理与 Matplotlib 可视化上手实践 【免费下载链接】code_snippets 项目地址: https://gitcode.com/gh_mirrors/co/code_snippets 如果你从没写过数据分析代码,这篇教程给你一条最短路径:拿一份真实的 CSV … · 2026/11/5 7:45:49

Boring Notch 安装指南:3 步搞定未识别开发者弹窗
Boring Notch 安装指南:3 步搞定未识别开发者弹窗

Boring Notch 安装指南:3 步搞定未识别开发者弹窗 【免费下载链接】boring.notch TheBoringNotch: Not so boring notch That Rocks 🎸🎶 项目地址: https://gitcode.com/gh_mirrors/bor/boring.notch 刚下载完 Boring Notch&#xff… · 2026/11/5 7:45:49

CMAC算法的各种密码分析方法全面盘点
CMAC算法的各种密码分析方法全面盘点

CMAC算法的各种密码分析方法全面盘点对CMAC(基于密码的消息认证码)的密码分析,其攻击面已从传统的数学理论扩展到量子计算和具体实现等多个维度。以下是针对CMAC算法的各类密码分析方法全面盘点。📜 经典密码分析攻击这类攻击基于… · 2026/11/5 7:45:49

CRC-MAC算法的各种密码分析方法全面盘点
CRC-MAC算法的各种密码分析方法全面盘点

CRC-MAC算法的各种密码分析方法全面盘点将CRC(循环冗余校验)这种线性、非加密的校验和直接用作或改造为MAC(消息认证码),在密码学上是高度不安全的。其根本原因在于CRC的设计目标是检测随机传输错误,而非抵… · 2026/11/5 7:45:49

Linux --进程信号
Linux --进程信号

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 7:45:49

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码