【算法心得】硬币通过二叉树传递的题,分治精髓是干自己的事

这篇具有很好参考价值的文章主要介绍了【算法心得】硬币通过二叉树传递的题,分治精髓是干自己的事。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https://leetcode.cn/problems/distribute-coins-in-binary-tree/

这个题刚开始的思路是对树进行一个中序遍历,像有一个铲子从左往右推,所过之处摞起来的金币堆都被铲平,多出来的金币落到右边的金币坑里(或左边的金币坑)

但是这样有一个问题,怎么知道多余的金币是从哪个位置来的呢,那岂不是每个金币都要存它是谁多出来的,然后再算从当前位置到原始位置的距离,太繁琐了


既然这样不行,考虑分治,每一个子树都相当于进行了一个调度,把左边多出来的放到右边,右边多出来的放到左边

这个过程金币不一定够,父亲还得向上借。不过这个不用担心,先假装借到了,因为肯定够

父亲要借的金币数刚好也是爷爷所要知道的调度的信息,就以这个作为dfs传递的值吧


但是写着写着发现,光有这个量还不够,我们要最终求的是调度的步数,光是传递金币的量不行,还要传递步数

对于一个子树,要做的有三个步骤:左孩子平衡好自身,有孩子平衡好自身,向上借/供奉金币

向上借/供奉金币所做的步数,正好就是刚才的那个金币数
平衡好自身需要的步骤数=左孩子平衡步骤数+右孩子平衡步骤数+向上借/供奉金币数

因此,步骤数也应作为dfs传递的量


看了题解,有人是后序遍历(仔细想想,我这个虽然函数名写的dfs,也应该归到后序遍历上,因为虽然搜索的过程是根左右,但是处理的顺序是左右根,先搜到了根,但是等左右处理好了才根据它们的值再处理根),然后她也递归,但是只传一个值

    private int ans = 0;
    public int lrd(TreeNode root){
        root.val += lrd(root.left);
        root.val += lrd(root.right);
        ans += Math.abs(root.val - 1);
        return root.val - 1;
    }

她直接把.val给改了,相当于改成了我那里的借/多的金币,这样就不用传了

步数那块,她没有管左边平衡自己要多少步,右孩子平衡自身要多少步,它只关心一个数据,那就是要向上借/送多少个金币。这是自己比孩子多做的事

而孩子要多少步,孩子自己会直接告诉全局变量ans的。反正每个节点都只处理一次,不重不漏的

这样挺好,这才是真正的分治,管好自己,管孩子干啥文章来源地址https://www.toymoban.com/news/detail-560926.html

到了这里,关于【算法心得】硬币通过二叉树传递的题,分治精髓是干自己的事的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划 | 分治法 -- 所有可能的真二叉树

    给你一个整数  n  ,请你找出所有可能含  n  个节点的  真二叉树  ,并以列表形式返回。答案中每棵树的每个节点都必须符合  Node.val == 0  。 答案的每个元素都是一棵真二叉树的根节点。你可以按  任意顺序  返回最终的真二叉树列表 。 真二叉树  是一类二叉树,树中

    2024年04月16日
    浏览(28)
  • 二叉树算法思想和原理:介绍通过递归算法计算二叉树结点个数的基本思路及C#、C++代码示例

    二叉树是一种非常常见的数据结构,它由结点组成,每个结点最多有两个子结点,分别称为左子结点和右子结点。在二叉树中,每个结点都有一个数据域和一个指针域,指针域分别指向左子结点和右子结点。二叉树有很多种不同的类型,如满二叉树、完全二叉树、平衡二叉树

    2024年01月21日
    浏览(39)
  • 【数据结构】深入探讨二叉树的遍历和分治思想(一)

    🚩 纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章主要讲述二叉树的递归结构及分治算法的思想。  为了实现二叉树的基本操作以及更好的了解二叉树的结构,先手动创造一个链式二叉树。  创建出来的结构: 📗创建出来的这棵二叉

    2024年02月08日
    浏览(42)
  • Leecode刷题心得和bug(哈希表与二叉树)

    0 哈希表基础知识 三种常见的哈希表 当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。 数组 set (集合) map(映射) 这里数组就没啥可说的了,我们来看一下set。 在C++中,set 和 map 分别提供以下三种数据结构,其底层实现以及优劣如下表所示: 集合

    2024年02月04日
    浏览(30)
  • DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    Algorithm:【算法进阶之路】之算法面试刷题集合—数据结构知识和算法刷题及其平台、问题为导向的十大类刷题算法(数组和字符串、链表、栈和队列、二叉树、堆、图、哈希表、排序和搜索、回溯算法、枚举/递归/分治/动态规划/贪心算法)总结 目录 相关文章

    2024年02月08日
    浏览(53)
  • Redis的实现三:c语言实现平衡二叉树,通过平衡二叉树实现排序集

    概况 :Redis中的排序集数据结构是相当复杂的独特而有用的东西。它不仅提供了顺序排序数据的能力,而且具有按排名查询有序数据的独特特性。 (Sorted Set)是一种特殊的数据结构,它结合了集合(Set)和有序列表(List)的特点。在Redis中,每个成员都有一个分数(score),

    2024年01月16日
    浏览(43)
  • 一套模板搞定二叉树算法题--二叉树算法讲解002

    递归: 每个节点 都要恰好被访问一次, 本质上是二叉树的线性化 。 一个树形的结构,线性化为一个数组之类的\\\"串\\\"的结构。 示例二叉树原型图: 前序遍历执行顺序: 根节点--对左子树做前序遍历--对右子树做前序遍历 总的顺序:根节点--左子树--右子树 左子树中:根-左

    2024年02月02日
    浏览(33)
  • 一套模板搞定二叉树算法题--二叉树算法讲解004

    模拟忘记知识点和技巧时,遇到一个新的二叉树习题,该如何处理思考和写代码解题? 题目和题意: 题解1 成员变量self.ans: 题解2 递归回传: 该题是个经典二叉树题目 题目和题意: 题解: 分析,所有路径,每一个叶子节点都需要到达。到达之后,需要退出回到上一层的叶

    2024年02月19日
    浏览(34)
  • 一套模板搞定二叉树算法题--二叉树算法讲解003

    题目和题意: 图示: 题解: 题目和题意: 题解: 题目和题意: 题解: 题目和题意: 题解1: 写法1: 写法2: 题解2: 题目和题意: 题解:该题与叶子节点强相关,和自顶向下或自底向上并不强相关。 自底向上的图示: 题目和题意: 题解: 简洁写法: 思路易理解,代码

    2024年02月19日
    浏览(34)
  • 算法刷题Day 15 二叉树的层序遍历+翻转二叉树+对称二叉树

    层序遍历二叉树需要借助到队列 递归方法 迭代方法 就是简单的用上前序遍历迭代方法实现,不用想的太复杂 递归方法 迭代方法 这里使用了队列来存放两个要比较的结点。也可以使用栈,方法是类似的。

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包