一【题目类别】
- 深度优先搜索
二【题目难度】
- 简单
三【题目编号】
- 563.二叉树的坡度
四【题目描述】
- 给你一个二叉树的根节点 root ,计算并返回 整个树 的坡度 。
- 一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
- 整个树 的坡度就是其所有节点的坡度之和。
五【题目示例】
-
示例 1:
- 输入:root = [1,2,3]
- 输出:1
- 解释:
- 节点 2 的坡度:|0-0| = 0(没有子节点)
- 节点 3 的坡度:|0-0| = 0(没有子节点)
- 节点 1 的坡度:|2-3| = 1(左子树就是左子节点,所以和是 2 ;右子树就是右子节点,所以和是 3 )
- 坡度总和:0 + 0 + 1 = 1
-
示例 2:
- 输入:root = [4,2,9,3,5,null,7]
- 输出:15
- 解释:
- 节点 3 的坡度:|0-0| = 0(没有子节点)
- 节点 5 的坡度:|0-0| = 0(没有子节点)
- 节点 7 的坡度:|0-0| = 0(没有子节点)
- 节点 2 的坡度:|3-5| = 2(左子树就是左子节点,所以和是 3 ;右子树就是右子节点,所以和是 5 )
- 节点 9 的坡度:|0-7| = 7(没有左子树,所以和是 0 ;右子树正好是右子节点,所以和是 7 )
- 节点 4 的坡度:|(3+5+2)-(9+7)| = |10-16| = 6(左子树值为 3、5 和 2 ,和是 10 ;右子树值为 9 和 7 ,和是 16 )
- 坡度总和:0 + 0 + 0 + 2 + 7 + 6 = 15
-
示例 3:
- 输入:root = [21,7,14,1,1,2,2,3,3]
- 输出:9
六【解题思路】
- 利用深度优先搜索的思想
- 首先求出左子树的节点值和
- 然后求出右子树的节点值和
- 最后求当前节点的坡度
- 注意题目要求的是所有节点的坡度之和,并不是求根节点的坡度
- 最后返回结果即可
七【题目提示】
- 树中节点数目的范围在 [ 0 , 1 0 4 ] 内 树中节点数目的范围在 [0, 10^4] 内 树中节点数目的范围在[0,104]内
- − 1000 < = N o d e . v a l < = 1000 -1000 <= Node.val <= 1000 −1000<=Node.val<=1000
八【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的节点个数
- 空间复杂度: O ( L o g 2 N ) O(Log_{2}N) O(Log2N),其中 N N N 是二叉树的节点个数
九【代码实现】
- Java语言版
package DFS;
public class p563_BinaryTreeTilt {
int val;
p563_BinaryTreeTilt left;
p563_BinaryTreeTilt right;
public p563_BinaryTreeTilt(int val) {
this.val = val;
}
public p563_BinaryTreeTilt(int val, p563_BinaryTreeTilt left, p563_BinaryTreeTilt right) {
this.val = val;
this.left = left;
this.right = right;
}
public p563_BinaryTreeTilt() {
}
public static void main(String[] args) {
p563_BinaryTreeTilt root = new p563_BinaryTreeTilt(1);
p563_BinaryTreeTilt left = new p563_BinaryTreeTilt(2);
p563_BinaryTreeTilt right = new p563_BinaryTreeTilt(3);
root.left = left;
root.right = right;
int res = findTilt(root);
System.out.println("res = " + res);
}
private static int sum;
public static int findTilt(p563_BinaryTreeTilt root) {
sum = 0;
getTilt(root);
return sum;
}
public static int getTilt(p563_BinaryTreeTilt root) {
if (root == null) {
return 0;
}
int leftVal = getTilt(root.left);
int rightVal = getTilt(root.right);
sum += Math.abs(leftVal - rightVal);
return root.val + leftVal + rightVal;
}
}
- C语言版
#include<stdio.h>
#include<math.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int getTilt(struct TreeNode* root, int* sum)
{
if (root == NULL)
{
return 0;
}
int leftVal = getTilt(root->left, sum);
int rightVal = getTilt(root->right, sum);
*sum += abs(leftVal - rightVal);
return root->val + leftVal + rightVal;
}
int findTilt(struct TreeNode* root)
{
int sum = 0;
getTilt(root, &sum);
return sum;
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版