563.二叉树的坡度

一、题目描述

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

一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。

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

示例:

1
2
3
4
5
6
7
8
9
10
输入: 
1
/ \
2 3
输出: 1
解释:
结点的坡度 2 : 0
结点的坡度 3 : 0
结点的坡度 1 : |2-3| = 1
树的坡度 : 0 + 0 + 1 = 1

注意:

  1. 任何子树的结点的和不会超过32位整数的范围。
  2. 坡度的值不会超过32位整数的范围。

二、题解

1.递归

1.1 思路

此题与543.二叉树的直径的思路非常相似

  1. 使用递归,求得左右子树的节点之和,该节点的坡度即为左右子树的节点之和的差的绝对值,整棵树的坡度即为所有节点的坡度和

注意:

  1. 子树的节点和还包括根节点。
  2. 无孩子的结点的的坡度是0。

1.2 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int sumOfTree(struct TreeNode *root, int *sum)
{
if (root == NULL)
return 0;
if (root->left == NULL && root->right == NULL)
return root->val;
int l = sumOfTree(root->left, sum);
int r = sumOfTree(root->right, sum);
*sum += abs(l - r);
return l + r + root->val;
}

int findTilt(struct TreeNode *root)
{
if (root == NULL || (root->left == NULL && root->right == NULL))
return 0;
int res = 0;
sumOfTree(root, &res);
return res;
}