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

本文主要是介绍【代码随想录】【算法训练营】【第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. 二叉树路径的输出。

这篇关于【代码随想录】【算法训练营】【第17天】 [110]平衡二叉树 [257]二叉树的所有路径 [404]左叶子之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/998376

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

SpringBoot中的404错误:原因、影响及解决策略

《SpringBoot中的404错误:原因、影响及解决策略》本文详细介绍了SpringBoot中404错误的出现原因、影响以及处理策略,404错误常见于URL路径错误、控制器配置问题、静态资源配置错误... 目录Spring Boot中的404错误:原因、影响及处理策略404错误的出现原因1. URL路径错