【代码随想录】【算法训练营】【第17天】 [110]平衡二叉树 [257]二叉树的所有路径 [404]左叶子之和

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

day 17,又是一个令人愉快的周五~

题目详情

[110] 平衡二叉树

题目描述

110 平衡二叉树
110 平衡二叉树

解题思路

前提:平衡二叉树:左右子树高度差不超过1,
思路:从平衡二叉树定义上,可以看出判断平衡二叉树的方法是后序遍历各个结点高度差。
重点:平衡二叉树的判断。

代码实现

C语言
后序遍历计算高度, 递归
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int maxFun(int a, int b)
{
    return (a > b) ? a : b;
}

int absFun(int a, int b)
{
    return (a > b) ? (a - b) : (b - a);
}

int countHight(struct TreeNode *root)
{
    if (root == NULL)
    {
        return 0;
    }
    // 计算左右子树高度
    int leftHight = countHight(root->left);
    if (leftHight < 0)
    {
        return -1;
    }
    int rightHight = countHight(root->right);
    if (rightHight < 0)
    {
        return -1;
    }
    // 判断左右子树是否为平衡二叉树
    if (abs(leftHight - rightHight) > 1)
    {
        return -1;
    }
    return 1 + maxFun(leftHight, rightHight);
}

bool isBalanced(struct TreeNode* root) {
    return (countHight(root) < 0) ? false : true;
}

[257] 二叉树的所有路径

题目描述

257 二叉树的所有路径
257 二叉树的所有路径

解题思路

前提:二叉树的路径,就是从根节点到叶子结点的路径
思路:前序遍历
重点:递归回溯过程中的结点路径的保存。

代码实现

C语言
先序遍历 递归回溯 + sprintf
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

// 先序遍历
void travesal(struct TreeNode *root, char **result, int *returnSize, int *nums, int idx)
{
    if (root == NULL)
    {
        return ;
    }
    // 中
    nums[idx++] = root->val;
    if ((root->left == NULL) && (root->right == NULL))
    {
        // 遍历到叶子结点,输出路径
        (*returnSize)++;
        char *path = (char *)malloc(sizeof(char) * 1001);
        int len = 0;
        for (int i = 0; i < idx; i++)
        {
            if (i != (idx - 1))
            {
                len += sprintf(path + len, "%d->", nums[i]);
            }
            else
            {
                len += sprintf(path + len, "%d", nums[i]);
            }
        }
        result[(*returnSize) - 1] = path;
    }
    else
    {
        // 未遍历到有叶子结点,继续向子节点遍历
        // 左
        travesal(root->left, result, returnSize, nums, idx);
        // 右
        travesal(root->right, result, returnSize, nums, idx);
    }
    return ;
}

char** binaryTreePaths(struct TreeNode* root, int* returnSize) {
    *returnSize = 0;
    char **result = (char **)malloc(sizeof(char *) * 1001);
    int nums[1001];
    int idx = 0;
    travesal(root, result, returnSize, nums, idx);
    return result;
}

[404] 左叶子之和

题目描述

404 左叶子之和
404 左叶子之和

解题思路

前提:所求为左叶子结点的值的和
思路:遍历结点,找到所有叶子结点,且为左结点。
重点:左叶子结点的父节点,可能是右结点。

代码实现

C语言
先序,递归:标识左右结点
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int travesal(struct TreeNode *node, bool isLeft)
{
    int leftSum = 0;
    if (node == NULL)
    {
        return 0;
    }
    // 叶子结点的判断
    if ((node->left == NULL) && (node->right == NULL))
    {
        if (isLeft == true)
        {
            leftSum =  node->val;
        }
    }
    // 非叶子结点
    // 左
    leftSum += travesal(node->left, true);
    // 右
    leftSum += travesal(node->right, false);
    return leftSum;
}

int sumOfLeftLeaves(struct TreeNode* root){
    return travesal(root, false);
}
递归: 通过父节点判断是否为左叶子结点
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int travesal(struct TreeNode *node)
{
    int leftSum = 0;
    int rightSum = 0;
    if ((node == NULL) || ((node->left == NULL) && (node->right == NULL)))
    {
        return 0;
    }
    // 判断是否为左叶子结点,通过父节点实现判断
    if ((node->left != NULL) && (node->left->left == NULL) && (node->left->right == NULL))
    {
        leftSum = node->left->val;
    }
    else
    {
        // 非左叶子结点
        //左
        leftSum = travesal(node->left);
    }
    //右
    rightSum = travesal(node->right);
    return leftSum + rightSum;
}

int sumOfLeftLeaves(struct TreeNode* root){
    return travesal(root);
}

今日收获

  1. 平衡二叉树的判断;
  2. 二叉树路径的输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/636739.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fastjson漏洞之CVE-2017-18349

前言&#xff1a; 要想理解漏洞原理&#xff0c;首先看看Fastjson是什么&#xff0c;具体用来做什么才能更好的找到可以利用的场景&#xff1a; Fastjson 是一个由阿里巴巴开发的 Java 语言实现的高性能 JSON 解析器和生成器。它具有以下特点: 快速&#xff1a;Fastjson 在序列…

【区块链】caliper压力测试

本文上接postman接口测试 参照工程项目使用Caliper测试工具对食品安全溯源系统智能合约生成新食品(newFood)功能进行压力测试 首先启动webase python3 deploy.py startAll vim /opt/bencahmark/caliper-benchmark/networks/fisco-bcos/test-nw/fisco-bcos.json 命令便捷查…

LLama3 | 一. 本地 Web Demo 部署

前置工作 课程文档&#xff1a;Llama3-Tutorial/docs/hello_world.md at main SmartFlowAI/Llama3-Tutorial GitHub 1.安装vscode 2.安装vscode插件 Remote SSH 3.配置 VSCode 远程连接开发机 ssh连接开发机 进行端口映射 在开发机控制台中点击自定义服务&#xff0c;复…

Python编程之旅:从错误到精通的奇妙探险

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、初识Python编程的陷阱与解决方案 1. 语法错误&#xff1a;防范于未然 2. 逻辑错误&…

java+Angular+Nginx+原生HTML+JS+CSS+Jquery融合B/S版电子病历系统云HIS系统源码

javaAngularNginx原生HTMLJSCSSJquery融合B/S版电子病历系统云HIS系统源码 Java版云HIS系统融合电子病历系统&#xff0c;是医学专用软件。医院通过电子病历以电子化方式记录患者就诊的信息&#xff0c;包括&#xff1a;首页、病程记录、检查检验结果、医嘱、手术记录、护理记录…

Day24:Leetcode:235. 二叉搜索树的最近公共祖先 + 701.二叉搜索树中的插入操作 + 450.删除二叉搜索树中的节点

LeetCode&#xff1a;235. 二叉搜索树的最近公共祖先 解决方案&#xff1a; 1.思路 对于当前节点x&#xff0c;如果x比p和q的值都大&#xff0c;说明&#xff0c;p和q在x的右子树里面&#xff0c;那么去x的右子树里面去寻找&#xff1b;对于当前节点x&#xff0c;如果x比p和…

VMware Ubuntu虚拟机开机黑屏的解决方法

由于不知名原因&#xff0c;我的VMware虚拟机隔三差五会出现开机即黑屏的现象。经过查阅资料和摸索&#xff0c;发现其中一种方法可以很好地解决我虚拟机的问题。 &#xff08;1&#xff09;打开虚拟机 &#xff08;2&#xff09;在虚拟机还在读条状态时&#xff0c;鼠标左键进…

数字营销:以大数据作引擎,推动企业全面数字化升级

数字营销本质乃是以大数据为核之心&#xff0c;促使营销活动高效运作&#xff0c;消费者线上线下数据的无缝衔接、企业内外部数据的贯通、公域引流私域运营等&#xff0c;皆已成为企业运营的标准配置。 数据即等同于市场&#xff0c;市场即等同于用户&#xff0c;用户乃是企…

【hive和spark】hive on spark和spark读取hive metastore配置

HIVE ON SPARK 和 SPARK READ HIVE METASTORE 具体hadoop 和 hive单机版本安装请参考单节点搭建hadoop和hive 此文是基与这篇基础上升级而来。 零、版本说明&#xff1a; 本例使用的版本&#xff0c;hive和spark版本对标Cloudera 公司的 cdh6.2.0 版本&#xff0c;hdfs图省事…

Android应用URI调起百度地图、高德地图 和 腾讯地图

1、百度地图 地图调起API | 百度地图API SDKhttps://lbs.baidu.com/faq/api?titlewebapi/uri/andriod例&#xff1a;反向地址解析 //反向地址解析URI private final String BAIDU_MAP_NAVI_URI "baidumap://map/geocoder?location";/*** 跳转百度地图*/ private…

消息号 KI261 成本中心 XXXX/123123 冻结而不能直接对 2020.10.08 收入记帐

做AR凭证遇到如上图所示的报错&#xff0c;检查之后发现是科目的成本要素类别与成本中心的控制面板-锁定中的类型不匹配&#xff0c;现在科目的成本要素类别是11&#xff0c;控制面板中锁定了“实际销售收入”与“计划收入”。 成本要素类别“11”代表主营收入或者库存收入&…

新手第一次做抖店,应该注意什么?知道这些技巧让你更快拿到结果

大家好&#xff0c;我是电商花花。 新手第一次刚开始接触抖音小店&#xff0c;都会担心自己做不好&#xff0c;操作不到位的想法&#xff0c;怕自己做店长时间不出单。 其实做店担心不出单是很正常的&#xff0c;但是只要我们掌握正确的做店方法和技巧也能很快就做好抖音小店…

大语言模型下的JSON数据格式交互

插&#xff1a; AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

【动态规划七】背包问题

目录 0/1背包问题 一、【模板】01背包 二、分割等和子集 三、目标和 四、最后一块石头的重量 II 完全背包问题 一、【模板】完全背包 二、零钱兑换 三、零钱兑换 II 四、完全平方数 二维费用的背包问题 一、一和零 二、盈利计划 似包非包 组合总和 卡特兰数 不…

“Excel+中文编程”衍生新型软件,WPS用户:自家孩子

你知道吗&#xff0c;我们中国人有时候真的挺有创新精神的。 你可能熟悉Excel表格&#xff0c;也可能听说过中文编程&#xff0c;但你有没有脑洞大开&#xff0c;想过如果把这两者结合起来&#xff0c;会碰撞出什么样的火花呢&#xff1f; 别不信&#xff0c;跟着我来看看吧&a…

惠普电脑怎么进入bios?图文教程助你轻松上手!

进入BIOS&#xff08;基本输入/输出系统&#xff09;是在电脑启动时进行硬件初始化和设置的重要步骤之一。对于惠普&#xff08;HP&#xff09;电脑用户来说&#xff0c;了解如何进入BIOS是解决一些硬件和系统问题的关键。本文将介绍惠普电脑怎么进入bios的三种方法&#xff0c…

Wireshark抓取PROFINET包问题总结

1.如何导入GSD文件 ? 打开Wireshark在【编辑】->【首选项】->【Protocols】->【PNIO】&#xff0c;设置GSD文件的路径。 添加完成后&#xff0c;就可以解析报文了 2.Frame check sequence和FCS Status显示 unverified ? 【编辑】->【首选项】->【Protocols】…

Kafka-集群管理者(Controller)选举机制、任期(epoch)机制

Kafka概述 Kafka-集群管理者&#xff08;Controller&#xff09;选举机制 Kafka中的Controller是Kafka集群中的一个特殊角色&#xff0c;负责对整个集群进行管理和协调。Controller的主要职责包括分区分配、副本管理、Leader选举等。当当前的Controller节点失效或需要进行重新…

Redis常见数据类型(3)-String, Hash

目录 String 命令小结 内部编码 典型的使用场景 缓存功能 计数功能 共享会话 手机验证码 Hash 哈希 命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx hincrby hincrbyfloat String 上一篇中介绍了了String里的基本命令, 接下来总结一…

什么是谷歌留痕?

其实它就是指你的网站在谷歌中留下的种种痕迹&#xff0c;无论你是在做外链&#xff0c;还是优化网站内容&#xff0c;或是改善用户体验&#xff0c;所有这些都会在谷歌的搜索引擎里留下一些“脚印”&#xff0c;用比较seo一点的说法&#xff0c;指的是网站在其构建和优化过程中…