题目介绍
力扣563题:leetcode-cn.com/problems/bi…
分析
从问题的描述中,可以清楚地了解到,我们需要在给定树的每个结点处找到其坡度,并将所有的坡度相加以获得最终结果。要找出任意结点的坡度,我们需要求出该结点的左子树上所有结点和以及其右子树上全部结点和的差值。
因此,为了找出解决方案,我们使用递归函数 traverse,在任何结点调用该函数,都会返回当前结点下面(包括其自身)的结点和。借助于任何结点的左右子结点的这一和值,我们可以直接获得该结点所对应的坡度。
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int result;
public int findTilt(TreeNode root) {
traverse(root);
return result;
}
/**
* 返回以当前节点为根节点的全部节点的和
*/
public int traverse(TreeNode root) {
if(root == null) {
return 0;
}
//得到左子树节点之和
int left = traverse(root.left);
//得到右子树节点之和
int right= traverse(root.right);
//更新二叉树的坡度
result += Math.abs(left - right);
//返回以当前结点为根节点的全部节点之和
return root.val + left + right;
}
}
复杂度分析
-
时间复杂度:O(n),其中 nn 是结点的数目。每个结点访问一次。
-
空间复杂度:O(n),在最糟糕的情形下,当树倾斜时,树的深度可以达到 n。平均情况下,树的深度为 logn。