【Leetcode -563.二叉树的坡度 - Nowcoder -KY11.二叉树遍历】

简介: 【Leetcode -563.二叉树的坡度 - Nowcoder -KY11.二叉树遍历】

Leetcode -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, 10^4] 内

  • 1000 <= Node.val <= 1000

思路:化为子问题用变量 ans 记录左子树和右子树每个节点的坡度;结束条件,如果为空,就返回0;如果不为空,就继续递归其左子树和右子树,计算其左子树与右子树的和;如果不为空,返回其左子树或右子树的和;

int dfs(struct TreeNode* root, int* ans)
    {
        if (root == NULL)
            return 0;
        //左右子树节点
        int leftTree = dfs(root->left, ans);
        int rightTree = dfs(root->right, ans);
        //该节点的坡度
        *ans += abs(leftTree - rightTree);
        //返回左右子树的和,和该根的 val
        return leftTree + rightTree + root->val;
    }
    int findTilt(struct TreeNode* root)
    {
        // ans 记录二叉树的坡度
        int ans = 0;
        dfs(root, &ans);
        return ans;
    }

c

题目:编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。

建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

输入描述:

输入包括1行字符串,长度不超过100。

输出描述:

可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。

示例1

输入:

abc##de#g##f###

输出:

c b e g d f a

思路:因为字符串是按照前序遍历得到的,所以我们也按照先创建根的节点,再创建其左右子树的节点,最后将它们连接起来;最后创建完二叉树后,按照中序遍历打印数据;

#include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    typedef char BTDataType;
    //节点的结构体
    typedef struct BinaryTreeNode
    {
        struct BinaryTreeNode* left;
        struct BinaryTreeNode* right;
        BTDataType data;
    }BTNode;
    //创建新的节点
    BTNode* BuyNode(BTDataType x)
    {
        BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
        assert(newnode);
        newnode->data = x;
        newnode->left = NULL;
        newnode->right = NULL;
        return newnode;
    }
    //创建二叉树
    BTNode* CreatTree(BTDataType* a, int* pi)
    {
        //如果是 # ,就返回空
        if (a[*pi] == '#')
        {
            (*pi)++;
            return NULL;
        }
        //如果不为空,就创建该字符的节点,pi往后遍历后面的字符
        BTNode* root = BuyNode(a[(*pi)++]);
        //将节点的左右子树连接起来
        root->left = CreatTree(a, pi);
        root->right = CreatTree(a, pi);
        //返回根
        return root;
    }
    //打印中序遍历
    void InOrder(BTNode* root)
    {
        if (root == NULL)
            return;
        InOrder(root->left);
        printf("%c ", root->data);
        InOrder(root->right);
    }
    int main()
    {
        char a[100];
        scanf("%s", &a);
        int i = 0;
        //i遍历字符串
        BTNode* root = CreatTree(a, &i);
        InOrder(root);
        return 0;
    }
目录
相关文章
|
1月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
1月前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历
|
1月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
34 7
|
1月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
15 3
|
1月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
60 0
|
1月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
32 0
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
41 6
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
35 4
|
1月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
71 2
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
17 4