力扣题部分:
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(自己所占的一个节点数)。