博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Binary Tree Tilt 二叉树的坡度
阅读量:6577 次
发布时间:2019-06-24

本文共 1877 字,大约阅读时间需要 6 分钟。

Given a binary tree, return the tilt of the whole tree.

The tilt of a tree node is defined as the absolute difference between the sum of all left subtree node values and the sum of all right subtree node values. Null node has tilt 0.

The tilt of the whole tree is defined as the sum of all nodes' tilt.

Example:

Input:          1       /   \      2     3Output: 1Explanation: Tilt of node 2 : 0Tilt of node 3 : 0Tilt of node 1 : |2-3| = 1Tilt of binary tree : 0 + 0 + 1 = 1

Note:

  1. The sum of node values in any subtree won't exceed the range of 32-bit integer.
  2. All the tilt values won't exceed the range of 32-bit integer.

这道题让我们求二叉树的坡度,某个结点的坡度的定义为该结点的左子树之和与右子树之和的差的绝对值,这道题让我们求所有结点的坡度之和。我开始的想法就是老老实实的按定义去做,用先序遍历,对于每个遍历到的结点,先计算坡度,根据定义就是左子树之和与右子树之和的差的绝对值,然后返回的是当前结点的tilt加上对其左右子结点调用求坡度的递归函数即可。其中求子树之和用另外一个函数来求,也是用先序遍历来求结点之和,为了避免重复运算,这里用哈希表来保存已经算过的结点,参见代码如下:

解法一:

public:    unordered_map
m; int findTilt(TreeNode* root) { if (!root) return 0; int tilt = abs(getSum(root->left, m) - getSum(root->right, m)); return tilt + findTilt(root->left) + findTilt(root->right); } int getSum(TreeNode* node, unordered_map
& m) { if (!node) return 0; if (m.count(node)) return m[node]; return m[node] = getSum(node->left, m) + getSum(node->right, m) + node->val; }};

但是在论坛中看了大神们的帖子后,发现这道题最好的解法应该是用后序遍历来做,因为后序遍历的顺序是左-右-根,那么就会从叶结点开始处理,这样我们就能很方便的计算结点的累加和,同时也可以很容易的根据子树和来计算tilt,参见代码如下:

解法二:

public:    int findTilt(TreeNode* root) {        int res = 0;        postorder(root, res);        return res;    }    int postorder(TreeNode* node, int& res) {        if (!node) return 0;        int leftSum = postorder(node->left, res);        int rightSum = postorder(node->right, res);        res += abs(leftSum - rightSum);        return leftSum + rightSum + node->val;    }};

参考资料:

本文转自博客园的博客,原文链接:

,如需转载请自行联系原博主。

你可能感兴趣的文章
使用 LeanCloud 服务做一站式 Chrome 插件开发 —— Favorite Image
查看>>
外包筛选心得
查看>>
markdown 列表下新段落
查看>>
浏览器拦截打开新窗口情况总结
查看>>
《Java工程师成神之路-基础篇》Java基础知识——序列化(已完结)
查看>>
iOS App间相互跳转漫谈 part2
查看>>
Android逆向之路---让我们试试另一种方法看漫画-(2)
查看>>
Java CAS 原理剖析
查看>>
iOS UIButton之UIEdgeInsets详解
查看>>
ISCC2014 writeup
查看>>
Java&Android 基础知识梳理(8) 容器类
查看>>
Kotlin 知识梳理(1) Kotlin 基础
查看>>
Redis内部数据结构详解(5)——quicklist
查看>>
OKio - 重新定义了“短小精悍”的IO框架
查看>>
注释那些事儿:前端代码质量系列文章(一)
查看>>
iOS-中集成百度echarts3-0
查看>>
js正则表达式
查看>>
iOS socket通信,编解码,浮点型数据解析
查看>>
四十四、【CardView】
查看>>
Spring 定时器的使用---Xml、Annotation、自定义
查看>>