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树,返回其节点值的前序遍历.例如,给定 ...
随机推荐
- C#版 - Leetcode 414. Third Maximum Number题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- I-think-3
一段很有哲理的话,与大家分享一下: 时光匆匆, 有些东西很重要,有些东西不重要, 有些东西已经不再重要,有些东西还是很重要. 宏观地看待人生,大学文凭只是一种达到目标的途径,而并非是唯一. 主要坚定自 ...
- DataRead和DataSet的异同
第一种解释 DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection(俗称:非断开式连接),在线操作数据库时,任何对SqlConnection的 ...
- Chapter 4 Invitations——18
But they were all in, and Edward was speeding away. 但是他们都在里面了之后,Edward就加速走了. I drove home slowly, ca ...
- 淘宝npm镜像使用方法(转)
1.临时使用 npm --registry https://registry.npm.taobao.org install express 2.持久使用 npm config set registry ...
- leetcode — pascals-triangle-ii
import java.util.Arrays; /** * * Source : https://oj.leetcode.com/problems/pascals-triangle-ii/ * * ...
- scrapy爬虫学习系列四:portia的学习入门
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- 设计模式-建造者模式(Builder)
简介: 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程创建出不同的表示. 结构图: 优点: 使得创建代码和表示代码分离,建造者隐藏了该产品是如何组装的,所以若需要改变一个产品内部的表示,只需 ...
- Java开发笔记(六十三)双冒号标记的方法引用
前面介绍了如何自己定义函数式接口,本文接续函数式接口的实现原理,阐述它在数组处理中的实际应用.数组工具Arrays提供了sort方法用于数组元素排序,可是并未提供更丰富的数组加工操作,比如从某个字符串 ...
- SpringBoot 之Actuator.
一.Actuator 介绍 Actuator 是 SpringBoot 项目中一个非常强大一个功能,有助于对应用程序进行监视和管理,通过 restful api 请求来监管.审计.收集应用的运行情况. ...