563. 二叉树的坡度

难度 简单
给定一个二叉树,计算 整个树 的坡度 。

一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。

整个树 的坡度就是其所有节点的坡度之和。

示例 1:

输入:root = [1,2,3]
输出:1
解释:
节点 2 的坡度:|0-0| = 0(没有子节点)
节点 3 的坡度:|0-0| = 0(没有子节点)
节点 1 的坡度:|2-3| = 1(左子树就是左子节点,所以和是 2 ;右子树就是右子节点,所以和是 3 )
坡度总和:0 + 0 + 1 = 1

示例 2:

输入:root = [4,2,9,3,5,null,7]
输出:15
解释:
节点 3 的坡度:|0-0| = 0(没有子节点)
节点 5 的坡度:|0-0| = 0(没有子节点)
节点 7 的坡度:|0-0| = 0(没有子节点)
节点 2 的坡度:|3-5| = 2(左子树就是左子节点,所以和是 3 ;右子树就是右子节点,所以和是 5 )
节点 9 的坡度:|0-7| = 7(没有左子树,所以和是 0 ;右子树正好是右子节点,所以和是 7 )
节点 4 的坡度:|(3+5+2)-(9+7)| = |10-16| = 6(左子树值为 3、5 和 2 ,和是 10 ;右子树值为 9 和 7 ,和是 16 )
坡度总和:0 + 0 + 0 + 2 + 7 + 6 = 15

示例 3:

输入:root = [21,7,14,1,1,2,2,3,3]
输出:9

提示:

树中节点数目的范围在 [0, 104] 内
-1000 <= Node.val <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-tilt
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

思路:递归
肯定递归
首先用sum递归出每一个结点的和(左子树的和与右子树的和与结点的值的总和)
在用findEveryTilt递归出每一个结点的坡度
在用findTilt递归出所有结点的坡度之和
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int findTilt(TreeNode root) {int tilt = 0;if (root!=null){tilt+=findEveryTilt(root);tilt+=findEveryTilt(root.left);tilt+=findEveryTilt(root.right);}return tilt;}public int sum(TreeNode root){if(root.left==null&&root.right==null){return root.val;}if (root.left==null){return root.val+sum(root.right);}if (root.right==null){return root.val+sum(root.left);}int Sum=0;    Sum+=root.val+sum(root.left)+sum(root.right);return Sum;}public int findEveryTilt(TreeNode root) {if(root.left==null&&root.right==null){return 0;}if (root.left == null){return sum(root.right);}if (root.right == null){return sum(root.left);}int leftSum=sum(root.left);int rightSum=sum(root.right);return Math.abs(leftSum-rightSum);}
}

官方

方法一:深度优先搜索
思路和算法

根据题意,我们需要累计二叉树中所有结点的左子树结点之和与右子树结点之和的差的绝对值。因此,我们可以使用深度优先搜索,在遍历每个结点时,累加其左子树结点之和与右子树结点之和的差的绝对值,并返回以其为根结点的树的结点之和。

具体地,我们实现算法如下:

  • 从根结点开始遍历,设当前遍历的结点为 node;
    遍历node 的左子结点,得到左子树结点之和sum_left;遍历 node 的右子结点,得到右子树结点之和sum_right;
    将左子树结点之和与右子树结点之和的差的绝对值累加到结果变量ans;
    返回以 node 作为根结点的树的结点之和 sum_left+sum_right+node.val。
class Solution {int ans = 0;public int findTilt(TreeNode root) {dfs(root);return ans;}public int dfs(TreeNode node) {if (node == null) {return 0;}int sumLeft = dfs(node.left);int sumRight = dfs(node.right);ans += Math.abs(sumLeft - sumRight);return sumLeft + sumRight + node.val;}
}

563. 二叉树的坡度【我亦无他唯手熟尔】相关推荐

  1. 237. 删除链表中的节点【我亦无他唯手熟尔】

    237. 删除链表中的节点 请编写一个函数,用于 删除单链表中某个特定节点 .在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 . 题目数据保证需要删除的节点 不 ...

  2. 136. 只出现一次的数字【我亦无他唯手熟尔】

    136. 只出现一次的数字 136. 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素.说明:你的算法应该具有线性时间复杂度. 你 ...

  3. 1929. 数组串联【我亦无他唯手熟尔】

    1929. 数组串联 题目 题解 题目 给你一个长度为 n 的整数数组 nums .请你构建一个长度为 2n 的答案数组 ans ,数组下标 从 0 开始计数 ,对于所有 0 <= i < ...

  4. 438. 找到字符串中所有字母异位词【我亦无他唯手熟尔】

    438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 题解 官方 438. 找到字符串中所有字母异位词 难度 中等 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 ...

  5. 786. 第 K 个最小的素数分数【我亦无他唯手熟尔】

    786. 第 K 个最小的素数分数 786. 第 K 个最小的素数分数 题解 786. 第 K 个最小的素数分数 难度 困难 给你一个按递增顺序排序的数组 arr 和一个整数 k .数组 arr 由 ...

  6. 樊登读书搞定读后感_读书笔记/读后感《读懂一本书,樊登读书法》——无他唯手熟尔...

    当我们在生活及工作中遇到问题的时候,通常会请教同事或者上网搜索解决方法,但是我们忽略了另外一个解决问题的途径,那就是通过阅读书籍积累知识.为什么大家并不习惯于阅读书籍呢,那是因为大家认为眼前遇到问题最 ...

  7. 卖油翁 欧阳修 无他,但手熟尔

    陈康肃公尧咨善射,当世无双,公亦以此自矜.尝射于家圃,有卖油翁释担而立,睨之,久而不去.见其发矢十中八九,但微颔之. 康肃问曰:"汝亦知射乎?吾射不亦精乎?"翁曰:"无他 ...

  8. 编程思想:我亦无他,唯手熟尔

    目录 一.编程思想三大定理 二.编程思想四大特性 三.做到高内聚,低耦合 (一)内聚 (二)耦合 一.编程思想三大定理 (1)思路分析,化繁为简:将需求拆成多个步骤实现,先完成基本功能和大致框架,在往 ...

  9. LeetCode 391. 完美矩形(扫描线) / 318. 最大单词长度乘积 / 563. 二叉树的坡度

    391. 完美矩形 2021.11.16 每日一题 题目描述 给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形.这 ...

  10. 563. 二叉树的坡度

    题目 我的想法 从根节点开始,求出每个几点的度,然后累加.代码如下: # Definition for a binary tree node. class TreeNode:def __init__( ...

最新文章

  1. 【MySQL】基础知识
  2. 《算法竞赛进阶指南》打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归、二进制状态压缩、dfs
  3. boost::log模块实现logging旋转文本文件的示例
  4. python中knn_如何在python中从头开始构建knn
  5. default.html文件,default.html
  6. nginx中配置angular项目_强大,Nginx配置一键生成
  7. FD.io VPP:CentOS7下构建自己的VPP RPM包
  8. CENTOS6.5 TFS部署
  9. 企业要做有价值的私域流量三大关键
  10. npm设置仓库register
  11. 简述算法和程序的区别并举例说明
  12. 技术分享 | 如何实现小程序与 App 的跳转
  13. Spring——事物操作
  14. 产品设计和交互设计总结
  15. Authorization头的作用
  16. 手机电池为什么会爆炸
  17. P3223 [HNOI2012]排队(高中排列组合)
  18. LibreOffice转换文档格式命令
  19. Linux在vi/vim编辑文件时(104键)键盘右边数字键输入异常解决方法
  20. Linux的修仙路(budgie ubuntu20.04)

热门文章

  1. 我们走在一起——走进京杭大运河漕运码头
  2. c++编译报错:ld returned 1 exit status
  3. 以太坊之dapp例子
  4. The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path
  5. tomcat启动异常之信The APR based Apache Tomcat Native library which allows optimal performance in produ
  6. 差分与反差分计算(MATLAB)
  7. 【Unity】基础知识结构总结
  8. 赶上时代步伐,我们也来做“菱形图片”
  9. 终于等到你:国内黑客团队360Vulcan公布iOS 12.1越狱漏洞细节
  10. python如何爬取煎蛋图片(js)