题目
解题思路
很容易想到用递归,左右子树的高度差即最大深度差,再写一个返回最大深度的函数即可:
执行结果为:
但是这样的话最坏情况时间复杂度已经达到O(n2)了,主要是每一个节点都要查询左右子树的最大深度,即递归调用isBalanced()时每一个isBalanced()函数中都包含两个完整的maxdepth()的递归,所以同一个节点会被maxdepth调用很多次,有重复计算,所以应该针对这一点进行优化。
官方题解中给的方法其实就是一个标记的思想:
可以看到,如果以某个节点为根节点的树不是平衡树,那么会将深度赋值为-1,再往上的节点也不可能是平衡树了,深度都为-1。相当于在isBalanced()中返回了root树的最大深度,只是如果不是平衡树的话,深度会为-1。所以不需要再递归调用isBalanced()了,看有没有标记就够了,将深度赋值为-1就是起到一个标记的作用。
此外,在之前的写法中,最坏情况下,从根节点开始,每一个节点都要通过maxdepth遍历一次它所有的子节点,相当于是自顶向下式;而优化后的写法,只包含一个完整的maxdepth递归,在判断当前节点之前都已经判断完了它的子节点,类似后序遍历,也就是自底向上式,每个节点都只遍历一遍,所以时间复杂度为O(n)。
执行结果为: