题目描述:
给你一个二叉树的根节点 root ,计算并返回 整个树 的坡度 。
一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
整个树 的坡度就是其所有节点的坡度之和。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-tilt
示例:
输入:root = [1,2,3]
输出:1
解释:
节点 2 的坡度:|0-0| = 0(没有子节点)
节点 3 的坡度:|0-0| = 0(没有子节点)
节点 1 的坡度:|2-3| = 1(左子树就是左子节点,所以和是 2 ;右子树就是右子节点,所以和是 3 )
坡度总和:0 + 0 + 1 = 1
思路:
分解问题规模:
首先计算一个节点的坡度,然后遍历树相加,最后得到整个树的坡度
java代码:
public int findTilt(TreeNode root) {
if(root==null){
return 0;
}
int sum=0;
sum+=onePodu(root);
if(root.left!=null){
sum+=findTilt(root.left);
}
if(root.right!=null){
sum+=findTilt(root.right);
}
return sum;
}
//计算一个节点的坡度
public int onePodu(TreeNode root){
if(root==null){
return 0;
}
return Math.abs(sum(root.left)-sum(root.right));
}
//计算节点之和
public int sum(TreeNode root){
if(root==null){
return 0;
}
return root.val+sum(root.left)+sum(root.right);
}
python代码:
def sum(self,root):
if root==None:
return 0;
return root.val+self.sum(root.left)+self.sum(root.right);
def onePodu(self,root):
if root==None:
return 0
left = self.sum(root.left)
right = self.sum(root.right)
res = left - right
return res if res > 0 else -res;
def findTilt(self,root):
if root==None:
return 0;
sum=0;
sum+= self.onePodu(root);
if root.left!=None:
sum+=self.findTilt(root.left);
if root.right!=None:
sum+=self.findTilt(root.right);
return sum;
运行截图: