代码随想录day15 平衡二叉树 | 二叉树的所有路径 | 左叶子之和 | 完全二叉树的节点个数
平衡二叉树
解题思路
二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。
这道题由于需要求节点的高度差来进行判断,因此我们需要用后序遍历,先左右,后中间。推荐使用递归把每个节点的高度算出来,然后通过两个子节点左右相减,判断是否为平衡二叉树。当有结果不符合时,设为-1。
知识点
递归,二叉树
心得
复习了昨天有关深度和高度的题目,第一次做时不知道如何将判断高度差的代码写对,后来看了题解才恍然大悟。
【二刷】这个递归的思路是有点复杂的,首先确定我们需要得到左右两个子树的深度来判断是否为完全二叉树,所以需要递归能够返回值int,难点在于如何获取深度。解决办法是当遇到空节点时返回零,如果不符合平衡二叉树时返回-1,剩下的情况是取左右两个结点深度的最大值。
二叉树的所有路径
解题思路
这个主要考虑的是字符串的格式问题,在这里我们需要进行回溯,即当遍历到一个叶子节点并存储完之后,字符串需要回退至上一个没有加“->”的版本,再接着进行遍历。我们可以使用栈或者递归来解决。
知识点
回溯,字符串,堆栈,二叉树
心得
一开始确实忘记了需要回溯这件事,想通了之后一下子就把代码写出来了
【二刷】这次采用了递归的方式解决这道题,通过使用两个堆栈分别存储当前的结点和字符串,这样的好处是可以记录之前遍历过的路径,方便进行回溯,注意一开始就需要把根结点的路径存入
左叶子之和
解题思路
判断左叶子的思路就是看一个节点的左节点是否为叶子节点即可,把这个思路和遍历的思路合并一下就行。
知识点
叶子节点,二叉树
心得
简单的题目
完全二叉树的节点个数
解题思路
主要讲讲如何利用完全二叉树的特性,完全二叉树就是除了倒数第二次层和最后一层外,每一层的节点都拥有左右子节点,最后一层的节点全部没有子节点。我们可以利用这个特性让每个节点只遍历其左节点和其左节点的左节点直到最后一层来得到该节点的深度。右节点同理。如果最后一个节点的左右深度相同,则最后的结果等于2^n - 1, n为深度。如果不想等则继续遍历左右节点,求出以他们为根节点的完全二叉树的个数
知识点
完全二叉树,二叉树的深度,二叉树的遍历
心得
学到了如何利用完全二叉树的特性来解题。
【二刷】完全二叉树的求解点个数可以看作遍历寻找满二叉树,如果该完全二叉树是一个满二叉树(左右子树深度相同),那么可以直接利用满二叉树的数量特性得到结果,不然就把每个子节点看作是一个完全二叉树的根节点,在进行相同的判断即可,