【算法】Distribute Coins in Binary Tree 在二叉树中分配硬币

这篇具有很好参考价值的文章主要介绍了【算法】Distribute Coins in Binary Tree 在二叉树中分配硬币。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Distribute Coins in Binary Tree 在二叉树中分配硬币

问题描述:

给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币。

在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。(移动可以是从父结点到子结点,或者从子结点移动到父结点。)。

返回使每个结点上只有一枚硬币所需的移动次数。

1 < = N < = 100 0 < = n o d e . v a l < = N 1 <= N <= 100\\ 0 <= node.val <= N 1<=N<=1000<=node.val<=N

分析

有n个节点,每个节点上有值,并且表示该节点的coin数量。

一个coin移动到相邻的节点,就是一次移动。

目标就是求每个节点都有1个coin的时候,移动的次数。
一共有 n 个节点, n 个 c o i n n个节点,n个coin n个节点,ncoin,所以最终一定可以达到每个节点都有 1 个 c o i n 1个coin 1coin

问题就在于要使用什么方法来计算。

很明显当一个节点的coin>1的时候,说明多出来的就需要分出去。而coin=0的时候,就需要进来一个
但是以一个节点为角度观察,当多出来的coin,需要出去,那么应该去父节点,还是子节点,同时coin的去向还要考虑到相邻的节点是否需要。

以最简单的情况思考当 p是leaf node.

  • 如果p.val>1,说明此时,多出来的一定要给父节点。
  • 而p.val=0,此时父节点必须给p一个coin。
  • p . v a l = = 1 p.val==1 p.val==1,p作为叶子,是不需要做任何处理的,对整体计算结果无影响。

如果p不是叶子,并且p作为一个子树的root,包含p在内有m个节点,同时p为root的子树上的coins总数为cnt。

  • 当m==cnt时,说明p上的coin可以完全分配到p子树的所有节点,不需要上交,也不需要额外的节点。
  • 当m<cnt,说明p的子树要达到完全分配,就必须上交cnt-m个coin。
  • 当m>cnt,说明p的子树要达到完全分配,就必须有父节点给它m-cnt个coin。

到此可以总结一个规律:

可以确定的一点,在p的父节点和p的路径上,必然要有abs(m-cnt)的coin移动一次。而且不需要关心节点的最终目标在哪里。

除了root节点,每个节点都与父节点有一个路径,即n-1条。
那么对每个节点都进行一次计算,就可以得到coin在每一个路径移动的次数。
设计一个dfs(root),返回root为根节点的子树,2个值{子树的总结点数,子树的总coins数}

代码

int ans=0;
    public int distributeCoins(TreeNode root) {
        dfs(root);
        return ans;
    }
    public int[] dfs(TreeNode root){
        if(root==null) return new int[]{0,0};
        int[] cnt =  new int[]{root.val,1};        
        int[] left = dfs(root.left); 
        int[] right = dfs(root.right);
        cnt[1]+= left[1]+right[1];
        cnt[0]+= left[0]+right[0];;
        ans+= Math.abs(cnt[1]-cnt[0]);
        return cnt;
    }

时间复杂度 O ( N ) O(N) O(N)

空间复杂度 O ( N ) O(N) O(N)

Tag

Tree

DFS文章来源地址https://www.toymoban.com/news/detail-565322.html

到了这里,关于【算法】Distribute Coins in Binary Tree 在二叉树中分配硬币的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构第四天: Complete Binary Search Tree 【搜索二叉树,完全二叉树】

     这道题需要的操作时排序并且需要遍历,最重要的一点它是个完全二叉树,所以数组是最适合的 这道题我的思路来自于浙江大学课件7.0.2完全二叉树 这道题说白就是将输入的样例构造成一个完全搜索二叉树。因为完全线索二叉树的 根节点一定是是一个处于左右子树中间的那

    2024年02月06日
    浏览(55)
  • Java 【数据结构】 二叉树(Binary_Tree)【神装】

        登神长阶  第五神装 二叉树 Binary-Tree 目录  🎷一.树形结构 🪗1.概念 🎸2.具体应用 🎹 二.二叉树(Binary Tree) 🎺1.概念  🎻2.表现形式 🪕3.特殊类型 🥁3.1完全二叉树(Complete Binary Tree) 🪘3.2满二叉树(Full Binary Tree) 🔋4.性质  🪫5.二叉树的遍历 💿5.1前中后序遍历

    2024年04月27日
    浏览(45)
  • Java学数据结构(2)——树Tree & 二叉树binary tree & 二叉查找树 & AVL树 & 树的遍历

    1.树的出现:解决链表线性访问时间太慢,树的时间复杂度O(logN); 2.二叉树的定义,最多两个儿子节点; 3.二叉查找树,左小,右大,中居中;remove方法,两种,只有一个儿子节点,有两个儿子节点; 4.AVL树,在二叉查找树基础上加平衡条件,旋转方法,单旋转,双旋转;

    2024年02月10日
    浏览(49)
  • 算法通关村——二分查找在二叉树中的应用

    二叉搜索树中的搜索 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 一开始以为很难,无从下手,但是题目已经规定了这是二叉搜索树,意味着将元素按照中序排

    2024年02月13日
    浏览(38)
  • 设计一个求结点x在二叉树中的双亲结点算法

    要设计一个求二叉树中指定节点 x 的双亲节点的算法,可以按照以下步骤进行: 创建一个递归函数  findParent(root, x) ,其中  root  是当前子树的根节点, x  是要查找其双亲节点的节点。 首先检查根节点是否为空或者根节点是否就是要查找的节点 x,若是,则说明 x 没有双亲

    2024年02月04日
    浏览(43)
  • 二叉树题目:在二叉树中增加一行

    标题:在二叉树中增加一行 出处:623. 在二叉树中增加一行 5 级 要求 给定一个二叉树的根结点 root texttt{root} root 和两个整数 val texttt{val} val 和 depth texttt{depth} depth ,在给定的深度 depth texttt{depth} depth 处添加一行值为 val texttt{val} val 的结点。 注意,根结点 root texttt{root}

    2024年02月06日
    浏览(34)
  • 979. 在二叉树中分配硬币(力扣)

    给你一个有 n 个结点的二叉树的根结点 root ,其中树中每个结点 node 都对应有 node.val 枚硬币。整棵树上一共有 n 枚硬币。 在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。移动可以是从父结点到子结点,或者从子结点移动到

    2024年02月16日
    浏览(32)
  • 在二叉树中查找值为 x的结点,试编写算法(用 C语言)打印值为 X 的结点的所有祖先,假设值为x的结点不多于一个。

    分析: 两种思路,递归和非递归。 思路: 考虑递归,当前结点值不等于 x 时,递归其左右子树,如果两者有一个返回值为 true,则说明当前结点为 x 的祖先结点,直接打印。 思路: 非递归,因为在遇到 x 的时候需要将其所有祖先打印,而当访问到 x 且能保留x 的祖先的方法

    2024年02月03日
    浏览(40)
  • 二叉查找树(binary search tree)(难度7)

    C++数据结构与算法实现(目录) 答案在此:二叉查找树(binary search tree)(答案) 写在前面 部分内容参《算法导论》 基本接口实现 1 删除 删除值为value的第一个节点 删除叶子节点1 删除叶子节点1 (3)删除叶子节点1 删除有两个孩子的节点z 分成下面几个步骤进行: 1 找到

    2024年02月10日
    浏览(45)
  • 二叉搜索树(Binary_Search_Tree)

    二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。 它的左右子树也分别为二叉搜索树。 如: a、从根开始

    2024年04月28日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包