LeetCode算法题-Binary Tree Tilt(Java实现)
这是悦乐书的第263次更新,第276篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第130题(顺位题号是563)。给定二叉树,返回整棵树的倾斜度。树节点的倾斜被定义为所有左子树节点值的总和与所有右子树节点值的总和之间的绝对差。 空节点倾斜0。整棵树的倾斜度定义为所有节点倾斜的总和。例如:
输入:
1
/ \
2 3
输出:1
说明:节点2的倾斜度为0,节点3的倾斜度为0,节点1的倾斜:| 2-3 | = 1,二叉树的倾斜:0 + 0 + 1 = 1。
注意:
任何子树中的节点值总和不会超过32位整数的范围。
所有倾斜值都不会超过32位整数的范围。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
根据题目对于倾斜度的定义,当前节点的左子树所有节点值之和与右子树所有节点值之和的绝对值就是倾斜度。我们先来看两个例子:
1
/ \
2 3
/ \ / \
4 5 6 7
上面的二叉树自上而下可以计算的子树有三次,一是从根节点1开始,二是从左子树节点2开始,三是从右子树节点3开始。
|(2+4+5)-(3+6+7)| = 5
|4-5| = 1
|6-7| = 1
所以该二叉树的倾斜度是7。
1
/ \
2 3
/ \
4 5
上面的二叉树自上而下可以计算的子树有两次,一是从根节点1开始,二是从左子树节点2开始。
|(2+4+5)-3| = 8
|4-5| = 1
所以该二叉树的倾斜度是9。
如果从上往下计算,会出现重复计算,所以我们可以从下往上开始计算,使用递归的方法,先计算相邻左右节点的绝对值,然后返回到上一层父节点,附带加上父节点的节点值,相当于计算了其所在子树的节点值之和。
private int tilt = 0;
public int findTilt(TreeNode root) {
getNodeValue(root);
return tilt;
}
public int getNodeValue(TreeNode root) {
if (root == null) {
return 0;
}
int left = getNodeValue(root.left);
int right = getNodeValue(root.right);
tilt += Math.abs(left-right);
return left+right+root.val;
}
03 第二种解法
还可以使用迭代的方法,依旧是从下往上开始计算,使用栈来实现,借助其先进后出的特性,在最后计算根节点的左右子树。中间还使用了HashMap,以节点为key,所在子树累加的节点值为value。
public int findTilt2(TreeNode root) {
if (root == null) {
return 0;
}
int sum = 0;
Stack<TreeNode> stack = new Stack<TreeNode>();
Map<TreeNode, Integer> map = new HashMap<TreeNode, Integer>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.peek();
if ((node.left == null || map.containsKey(node.left)) &&
(node.right == null || map.containsKey(node.right))) {
stack.pop();
int left = map.containsKey(node.left) ? map.get(node.left) : 0;
int right = map.containsKey(node.right) ? map.get(node.right) : 0;
sum += Math.abs(left - right);
map.put(node, left + right + node.val);
} else {
if (node.left != null && !map.containsKey(node.left)) {
stack.push(node.left);
}
if (node.right != null && !map.containsKey(node.right)) {
stack.push(node.right);
}
}
}
return sum;
}
04 小结
算法专题目前已日更超过三个月,算法题文章130+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Binary Tree Tilt(Java实现)的更多相关文章
- LeetCode算法题-Binary Tree Paths(Java实现-3种解法)
这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...
- LeetCode算法题-Binary Tree Level Order Traversal II(Java实现)
这是悦乐书的第165次更新,第167篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第24题(顺位题号是107).给定二叉树,返回其节点值的自下而上级别顺序遍历(即从左到右 ...
- LeetCode算法题-Symmetric Tree(Java实现)
这是悦乐书的第163次更新,第165篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第22题(顺位题号是101).给定二叉树,检查它是否是自身的镜像(即,围绕其中心对称). ...
- LeetCode算法题-Binary Search(Java实现)
这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...
- LeetCode算法题-Binary Watch(Java实现)
这是悦乐书的第216次更新,第229篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第84题(顺位题号是401).二进制手表顶部有4个LED,代表小时(0-11),底部的6 ...
- LeetCode算法题-Same Tree(Java实现)
这是悦乐书的第162次更新,第164篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第21题(顺位题号是100).给定两个二叉树,编写一个函数来检查它们是否相同.如果两个二 ...
- LeetCode算法题-Binary Number with Alternating Bits(Java实现)
这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...
- LeetCode算法题-N-ary Tree Postorder Traversal(Java实现)
这是悦乐书的第269次更新,第283篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第136题(顺位题号是590).给定一个n-ary树,返回其节点值的后序遍历.例如,给定 ...
- LeetCode算法题-N-ary Tree Preorder Traversal(Java实现)
这是悦乐书的第268次更新,第282篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第135题(顺位题号是589).给定一个n-ary树,返回其节点值的前序遍历.例如,给定 ...
随机推荐
- Python内置函数(55)——round
英文文档: round(number[, ndigits]) Return the floating point value number rounded to ndigits digits afte ...
- Python内置函数(39)——locals
英文文档: locals() Update and return a dictionary representing the current local symbol table. Free var ...
- 受到 1 万点暴击,二狗子被 DDoS 攻击的惨痛经历
二狗子的遭遇 “好消息,好消息,免费 DDoS 攻击软件上线了,性感黑客在线攻击,帮您攻克所有商业难题.”二狗子不知道在看着什么网站,新买的 Mac 中发出热闹的声音. 二狗子想知道“DDoS 是什么 ...
- CentOS7 systemctl tomcat常用配置
开始配置tomcat 1.环境准备,安装java 在生产环境上,我一般使用oracle java,不使用openjdk,所以先卸载系统自带的openjdk yum remove java 下载orac ...
- Java基础20:Java8新特性终极指南
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署
运行环境 照例,先亮底 centos:7.2 cpu:1核 2G内存 1M带宽 辅助工具:xshell xftp 搭建.net core运行环境 .net core 的运行环境我单独写了一篇,请看我的 ...
- Linux下 Vim(Vi)编辑器的使用
vi编辑器 vi是UNIX和类UNIX环境下的可用于创建文件的屏幕编辑器.vi有两种工作模式:命令模式和文本输入模式.启动vi需要输入vi,按[Spacebar]键并输入文件名后回车. 切换模式键 v ...
- C#委托与事件总结
目录 C#委托与事件的总结 1.概述 2.委托 2.1 什么是委托 2.2 委託的使用 2.3 深入理解委托 2.4 为什么要使用委托 2.5 代码清单 3.事件 3.1 事件与委托的关系 3.2 订 ...
- v8 GC机制
1.为什么要分代 V8是Chrome浏览器的javascript解释器,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那 ...
- JS数组Sort方法的使用
想用sort方法对数组排下序,代码如下: var nums = "12 645 6 85 81 0 9 365 4 752".split(" ").map(fu ...