【代码随想录】【算法训练营】【第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

相关文章

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获

利用Python在万圣节实现比心弹窗告白代码

《利用Python在万圣节实现比心弹窗告白代码》:本文主要介绍关于利用Python在万圣节实现比心弹窗告白代码的相关资料,每个弹窗会显示一条温馨提示,程序通过参数方程绘制爱心形状,并使用多线程技术... 目录前言效果预览要点1. 爱心曲线方程2. 显示温馨弹窗函数(详细拆解)2.1 函数定义和延迟机制2.2

Springmvc常用的注解代码示例

《Springmvc常用的注解代码示例》本文介绍了SpringMVC中常用的控制器和请求映射注解,包括@Controller、@RequestMapping等,以及请求参数绑定注解,如@Request... 目录一、控制器与请求映射注解二、请求参数绑定注解三、其他常用注解(扩展)四、注解使用注意事项一、控制

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt

利用Python将PDF文件转换为PNG图片的代码示例

《利用Python将PDF文件转换为PNG图片的代码示例》在日常工作和开发中,我们经常需要处理各种文档格式,PDF作为一种通用且跨平台的文档格式,被广泛应用于合同、报告、电子书等场景,然而,有时我们需... 目录引言为什么选择 python 进行 PDF 转 PNG?Spire.PDF for Python

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)