110:
题目本身不难,递归做法在昨天求深度的代码的基础上添加左右子树高度差的判断就可以完成。但要注意在发现任意一个子树不符合要求返回 -1 的时候,也要检查当前的左右高度(子节点们返回的值)是否是 -1,如果是的话代表当前节点下方已经出现了不符合条件的子树,需要继续往回返回 -1。如果不加上左右高度是否为 -1 的检查的话就会让上一层递归使用 -1 作为错误的高度来继续计算,从而导致无法检测出一些特殊的非平衡二叉树。
257:
跟着题解的思路基本能理解,除了为什么每一次进入递归后要移除元素,但是自己在纸上画图模拟推演一下就很明白了:
移除元素虽然看起来是紧跟在递归后面,但实际只会在遍历到左底层并且记录完一条路径并且开始一层一层向上返回的时候才会发生。右侧也是同理,只有在一条路径结束之后才会开始移除元素。
还有一点和目前为止写的递归都不一样:单层主逻辑(把当前节点放入数据结构)在base case前就要发生,否则的话最底下的叶子节点无法被正确地记录下来。
404:
本身不是很难,一个难点在于要正确处理根节点左侧只有一个叶子节点的情况。
因为左右子树的遍历是从根节点的左右子节点开始的,然后本题又得从父节点来查左子节点,所以如果根节点左侧只有一个叶子节点,左右子树的遍历会漏算这个有效节点。
所以就需要额外定义一个整数变量,并在查找到左叶子时更新他,最后和左右sum一起返回,处理特殊情况的同时也能正确的在每一层给左右sum赋值。