这是悦乐书的第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实现)的更多相关文章

  1. LeetCode算法题-Binary Tree Paths(Java实现-3种解法)

    这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...

  2. LeetCode算法题-Binary Tree Level Order Traversal II(Java实现)

    这是悦乐书的第165次更新,第167篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第24题(顺位题号是107).给定二叉树,返回其节点值的自下而上级别顺序遍历(即从左到右 ...

  3. LeetCode算法题-Symmetric Tree(Java实现)

    这是悦乐书的第163次更新,第165篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第22题(顺位题号是101).给定二叉树,检查它是否是自身的镜像(即,围绕其中心对称). ...

  4. LeetCode算法题-Binary Search(Java实现)

    这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...

  5. LeetCode算法题-Binary Watch(Java实现)

    这是悦乐书的第216次更新,第229篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第84题(顺位题号是401).二进制手表顶部有4个LED,代表小时(0-11),底部的6 ...

  6. LeetCode算法题-Same Tree(Java实现)

    这是悦乐书的第162次更新,第164篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第21题(顺位题号是100).给定两个二叉树,编写一个函数来检查它们是否相同.如果两个二 ...

  7. LeetCode算法题-Binary Number with Alternating Bits(Java实现)

    这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...

  8. LeetCode算法题-N-ary Tree Postorder Traversal(Java实现)

    这是悦乐书的第269次更新,第283篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第136题(顺位题号是590).给定一个n-ary树,返回其节点值的后序遍历.例如,给定 ...

  9. LeetCode算法题-N-ary Tree Preorder Traversal(Java实现)

    这是悦乐书的第268次更新,第282篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第135题(顺位题号是589).给定一个n-ary树,返回其节点值的前序遍历.例如,给定 ...

随机推荐

  1. Python内置函数(27)——hasattr

    英文文档: hasattr(object, name) The arguments are an object and a string. The result is True if the stri ...

  2. 6.jQuery(实例)

    1.开关灯效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  3. 前端(各种demo)二:左侧导航栏的折叠和打开(不使用js)基础版和升级版

    1.给div设置定位. 复习一下—— css中position有五种属性: static:默认值,没有定位 absolute:绝对定位,相对于父级元素进行定位 relative:相对定位 fixed: ...

  4. Python链接Mssql之Python库pymssql

    连接数据库 pymssql连接数据库的方式和使用sqlite的方式基本相同: 使用connect创建连接对象 connect.cursor创建游标对象,SQL语句的执行基本都在游标上进行 cursor ...

  5. Elasticsearch索引原理

    转载 http://blog.csdn.net/endlu/article/details/51720299 最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计 ...

  6. CentOS安装FTP服务

    最近公司有一个内部比赛(黑客马拉松),报名参加了这么一个赛事,在准备参赛作品的同时(参赛服务器需要自己搭建),借着这个机会,决定把tomcat部署相关的知识从0到1重新捋一遍.就当备忘录了. FTP服 ...

  7. Java 技术笔记

    vlist提取字段生成新list List<int> uidList = urResult.stream().map(p -> p.getUserId()).collect(Coll ...

  8. nodejs操作session和cookie

    session: 安装模块 cnpm install express-session 引入session注册到路由 var express = require('express'); var sess ...

  9. 磊哥测评之数据库SaaS篇:腾讯云控制台、DMC和小程序

    本文由云+社区发表 作者:腾讯云数据库 随着云计算和数据库技术的发展,数据库正在变得越来越强大.数据库的性能如处理速度.对高并发的支持在节节攀升,同时分布式.实时的数据分析.兼容主流数据库等强大的性能 ...

  10. linux rsync 实际应用

    linux rsync 实际应用 一.rsync的概述 rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.rsync是Linux系统下的文件同步和 ...