首页 > 编程语言 >代码随想录算法训练营第十五天

代码随想录算法训练营第十五天

时间:2024-08-18 15:27:10浏览次数:10  
标签:return 递归 int 训练营 随想录 叶子 二叉树 第十五天 节点

力扣题部分:

110.平衡二叉树

题目链接:. - 力扣(LeetCode)

题面:

        给定一个二叉树,判断它是否是平衡二叉树

        平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1

思路(递归):

还是递归三部曲(关于三部曲的具体内容和对递归看法建议可见昨天的文章开头):

        传送门:代码随想录算法训练营第十四天-CSDN博客

确定递归函数的参数和返回值:

不仅仅需要bool判断,还要计算子树深度,所以需要再创建一个函数。

参数:TreeNode * cur,返回值类型:int。

确定终止条件:

如果当前节点为空,return 0。

如果当前节点为叶子节点 return 1。

确定单层递归的逻辑:

为了发现此树不为平衡树,我们需要把发现不平衡的记录传递回去。

所以一发现左右节点差 > 1,return -1。

不仅如此,一发现调用当前节点的左右节点后返回值为-1,同样return -1传递上去。

如果一切正常(没有接触到-1),就和计算最大深度差不多的操作:左右节点都有返回调用其中的最大值 + 1,如果只有左节点 返回调用左节点值 + 1,右节点同理。

如果到了最后,意味着当前节点没被传递-1且为叶子节点,return 1就可以了。

代码实现:

257. 二叉树的所有路径

题目链接. - 力扣(LeetCode)

题面:

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

思路(递归):

确定递归函数的参数和返回值:

最后返回的是字符串数组(restult),再弄一个函数void就可以了,在这个新函数里不断加入一个个字符串进最后的字符串数组里。

由于需要不断递归和相应的回溯操作,我们选择在最后用int数组(paths)转换成字符串,这样的话增删比字符串会方便很多,在此之前,遍历节点只需要把值压进int数组里就可以了。

确定终止条件:

当前节点为空或者当前节点为叶子节点且数组转换后时return;

确定单层递归的逻辑:

如果当前节点为叶子节点,把叶子节点值也压进path数组中,然后开始转换成字符串并压入result

如果当前节点不为叶子节点,先调用子节点,调用完记得将当前节点在path里pop掉

pop的使用其实就是回溯的体现。

代码实现:

404.左叶子之和

题目链接:. - 力扣(LeetCode)

题面:

给定二叉树的根节点 root ,返回所有左叶子之和。

思路(递归):

注意是判断左叶子,不是二叉树左侧节点!

确定递归函数的参数和返回值:

返回int,直接调用所给函数即可。

确定终止条件:

当前节点为空或叶子节点 return 0;

确定单层递归的逻辑:

先将leftsum 和 rightsum初始化

int leftsum = sumOfLeftLeaves(root->left);

int rightsum = sumOfLeftLeaves(root->right);

如果有左节点且子节点有左叶子节点,将初始化的值改成左叶子节点的值。

代码实现:

222.完全二叉树的节点个数

题目链接:. - 力扣(LeetCode)

题面:

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

思路(递归):

确定递归函数的参数和返回值:

返回int,直接调用所给函数即可。

确定终止条件:

当前节点为空return0。

确定单层递归的逻辑:

返回当前节点左节点的节点数 + 右节点的节点数 + 1(自己所占的一个节点数)。

代码实现:

标签:return,递归,int,训练营,随想录,叶子,二叉树,第十五天,节点
From: https://blog.csdn.net/b1ankwall/article/details/141185749

相关文章