题目链接:二叉树的坡度原题链接
题目描述:
给定一个二叉树,计算 整个树 的坡度 。
一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
整个树 的坡度就是其所有节点的坡度之和。
思路:
通过递归算出每个节点左子树val值的和sum1、右子数val值的和sum2,sum1与sum2差的绝对值就是每个节点的坡度,求总坡度直接将所有坡度相加即可。
优化前代码如下:
class Solution {
public int sum(TreeNode root) {
if (root == null) return 0;
return root.val + sum(root.left) + sum(root.right);
}
public int findTilt(TreeNode root) {
if (root == null) return 0;
return Math.abs(sum(root.left) - sum(root.right)) + findTilt(root.left) + findTilt(root.right);
}
}
由于最后要求总坡度,也还是要求和,所以可以将双递归代码优化成一次递归,降低时间复杂度。
做法:定义一个成员变量ans,在求和函数里面用左子树总和与右子数总和的差值的绝对值(即每个节点的坡度)记录下来(即ans),每一步递归都ans++,就可以求得所有坡度的和了。
代码如下:
class Solution {
int ans = 0;
public int dfs(TreeNode root) {
if (root == null) return 0;
int leftSum = dfs(root.left);
int rightSum = dfs(root.right);
ans += Math.abs(leftSum - rightSum);
return leftSum + rightSum + root.val;
}
public int findTilt(TreeNode root) {
if (root == null) return 0;
dfs(root);
return ans;
}
}
解题思路参考题解与评论,发文只是为了做个日常记录,加深印象并且更清晰地理解本题。