每日一题-- 简单 -- 二叉树的坡度(563)

85 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

题目:给你一个二叉树的根节点 root ,计算并返回 整个树 的坡度 。

一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。

整个树 的坡度就是其所有节点的坡度之和。

示例 2:

image.png

输入: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

🙇‍♂️ 感想:本题需要多读几遍才能理解题目真正要求的东西。首先一个细节是要求的是每个节点的和,每个节点的左右节点的差值的绝对值的和。一开始想着是直接递归从头到尾,将所有元素的左右节点的差值绝对值加起来,但是不对是要把每个节点的左右节点的所有节点包括叶子节点的和。感觉还是有点绕。但是也是先写出来了,到后面再回来看看 重新整理一下思路吧 😇

🙇‍♂️ 题解分析:本题也是使用递归的思路。 二叉树的坡度是每个节点的左右节点的差值绝对值的和,而且首先从叶子节点开始计算,如果没有左右节点则返回0

function findTilt(root: TreeNode | null): number {
  if (!root) return 0
  let result: number = 0
  if (root.left && root.right) {
    result += Math.abs(nodeSum(root.left) - nodeSum(root.right))
    result += findTilt(root.left)
    result += findTilt(root.right)
  } else if (root.left) {
    result += Math.abs(nodeSum(root.left))
    result += findTilt(root.left)
  } else if (root.right) {
    result += Math.abs(nodeSum(root.right))
    result += findTilt(root.right)
  }
  return result
};
function nodeSum (root: TreeNode | null): number {
  if (!root) return 0
  let sum: number = 0
  if (root.left) {
    sum += nodeSum(root.left)
  }
  if (root.right) {
    sum += nodeSum(root.right)
  }
  sum += root.val
  return sum
}