【LeetCode每日一题】——563.二叉树的坡度

一【题目类别】

  • 深度优先搜索

二【题目难度】

  • 简单

三【题目编号】

  • 563.二叉树的坡度

四【题目描述】

  • 给你一个二叉树的根节点 root ,计算并返回 整个树 的坡度 。
  • 一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
  • 整个树 的坡度就是其所有节点的坡度之和。

五【题目示例】

  • 示例 1:

    • 在这里插入图片描述
    • 输入:root = [1,2,3]
    • 输出:1
    • 解释:
      • 节点 2 的坡度:|0-0| = 0(没有子节点)
      • 节点 3 的坡度:|0-0| = 0(没有子节点)
      • 节点 1 的坡度:|2-3| = 1(左子树就是左子节点,所以和是 2 ;右子树就是右子节点,所以和是 3 )
      • 坡度总和:0 + 0 + 1 = 1
  • 示例 2:

    • 在这里插入图片描述
    • 输入: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
  • 示例 3:

    • 在这里插入图片描述
    • 输入:root = [21,7,14,1,1,2,2,3,3]
    • 输出:9

六【解题思路】

  • 利用深度优先搜索的思想
  • 首先求出左子树的节点值和
  • 然后求出右子树的节点值和
  • 最后求当前节点的坡度
  • 注意题目要求的是所有节点的坡度之和,并不是求根节点的坡度
  • 最后返回结果即可

七【题目提示】

  • 树中节点数目的范围在 [ 0 , 1 0 4 ] 内 树中节点数目的范围在 [0, 10^4] 内 树中节点数目的范围在[0,104]
  • − 1000 < = N o d e . v a l < = 1000 -1000 <= Node.val <= 1000 1000<=Node.val<=1000

八【时间频度】

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的节点个数
  • 空间复杂度: O ( L o g 2 N ) O(Log_{2}N) O(Log2N),其中 N N N 是二叉树的节点个数

九【代码实现】

  1. Java语言版
package DFS;

public class p563_BinaryTreeTilt {

    int val;
    p563_BinaryTreeTilt left;
    p563_BinaryTreeTilt right;

    public p563_BinaryTreeTilt(int val) {
        this.val = val;
    }

    public p563_BinaryTreeTilt(int val, p563_BinaryTreeTilt left, p563_BinaryTreeTilt right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }

    public p563_BinaryTreeTilt() {
    }

    public static void main(String[] args) {
        p563_BinaryTreeTilt root = new p563_BinaryTreeTilt(1);
        p563_BinaryTreeTilt left = new p563_BinaryTreeTilt(2);
        p563_BinaryTreeTilt right = new p563_BinaryTreeTilt(3);
        root.left = left;
        root.right = right;
        int res = findTilt(root);
        System.out.println("res = " + res);
    }

    private static int sum;

    public static int findTilt(p563_BinaryTreeTilt root) {
        sum = 0;
        getTilt(root);
        return sum;
    }

    public static int getTilt(p563_BinaryTreeTilt root) {
        if (root == null) {
            return 0;
        }
        int leftVal = getTilt(root.left);
        int rightVal = getTilt(root.right);
        sum += Math.abs(leftVal - rightVal);
        return root.val + leftVal + rightVal;
    }

}
  1. C语言版
#include<stdio.h>
#include<math.h>

struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
};

int getTilt(struct TreeNode* root, int* sum)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftVal = getTilt(root->left, sum);
	int rightVal = getTilt(root->right, sum);
	*sum += abs(leftVal - rightVal);
	return root->val + leftVal + rightVal;
}

int findTilt(struct TreeNode* root)
{
	int sum = 0;
	getTilt(root, &sum);
	return sum;
}

/*主函数省略*/

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值