LeetCode平衡二叉树(Python)

题目

在这里插入图片描述

解题思路

很容易想到用递归,左右子树的高度差即最大深度差,再写一个返回最大深度的函数即可:
在这里插入图片描述

执行结果为:
在这里插入图片描述
但是这样的话最坏情况时间复杂度已经达到O(n2)了,主要是每一个节点都要查询左右子树的最大深度,即递归调用isBalanced()时每一个isBalanced()函数中都包含两个完整的maxdepth()的递归,所以同一个节点会被maxdepth调用很多次,有重复计算,所以应该针对这一点进行优化。

官方题解中给的方法其实就是一个标记的思想:
在这里插入图片描述
可以看到,如果以某个节点为根节点的树不是平衡树,那么会将深度赋值为-1,再往上的节点也不可能是平衡树了,深度都为-1。相当于在isBalanced()中返回了root树的最大深度,只是如果不是平衡树的话,深度会为-1。所以不需要再递归调用isBalanced()了,看有没有标记就够了,将深度赋值为-1就是起到一个标记的作用。

此外,在之前的写法中,最坏情况下,从根节点开始,每一个节点都要通过maxdepth遍历一次它所有的子节点,相当于是自顶向下式;而优化后的写法,只包含一个完整的maxdepth递归,在判断当前节点之前都已经判断完了它的子节点,类似后序遍历,也就是自底向上式,每个节点都只遍历一遍,所以时间复杂度为O(n)。

执行结果为:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值