563. 二叉树的坡度
难度简单274
给你一个二叉树的根节点 root
,计算并返回 整个树 的坡度 。
一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
整个树 的坡度就是其所有节点的坡度之和。
代码语言:javascript复制输入:root = [1,2,3]
输出:1
解释:
节点 2 的坡度:|0-0| = 0(没有子节点)
节点 3 的坡度:|0-0| = 0(没有子节点)
节点 1 的坡度:|2-3| = 1(左子树就是左子节点,所以和是 2 ;右子树就是右子节点,所以和是 3 )
坡度总和:0 0 1 = 1
代码语言:javascript复制输入: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
代码语言:javascript复制输入:root = [21,7,14,1,1,2,2,3,3]
输出:9
提示:
- 树中节点数目的范围在
[0, 104]
内 -1000 <= Node.val <= 1000
思路:深度优先搜索(DFS)
首先要明白题意,我们要累加二叉树所有结点的左子树结点之和与右子树结点之和的差的绝对值。因此,我们可以使用深度优先搜索,在遍历每个结点时,累加其左子树结点之和与右子树结点之和的差的绝对值,并返回以其为根结点的树的结点之和。
- 先创建一个全局变量 sum 用于累加每个节点的绝对值的和,然后创建一个子函数,到子函数 _find() 中去递归。
- 用 left 和 right 分别递归得到左子树与右子树的值,然后用 sum 加上他们的绝对值的差。
- 返回以 root 作为根结点的树的结点之和 left right root->val
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int sum = 0;
int _find(TreeNode* root)
{
if(root == nullptr)
return 0;
int left = _find(root->left);
int right = _find(root->right);
sum = abs(left - right);
return root->val left right;
}
int findTilt(TreeNode* root) {
_find(root);
return sum;
}
};
复杂度分析
时间复杂度:O(n),其中 n 为二叉树中结点总数
空间复杂度:O(n)