面试官自创的非常灵活的一道中等题,引发了博主比较深的思考,特此小记一番。
题目
有两棵二叉树,当两树对应位置元素相同时,或者旋转左右子树能让两树对应位置元素相同时,则判定两二叉树相似。
思路
递归 需要处理的子问题有以下两种情况:
- 两子树对应位置元素是否相同
- 两子树旋转后对应位置是否相同
边界处理就是:
- 两树中有一个为空树一个不是
- 两树都是空树
- 两树元素不相同
那么可得 f(a.l, b.l) && f(a.r, f(b.r)) || f(a.l, b.r) && f(a.r, b.l)
问题
1.分析时间和空间复杂度
空间复杂度
递归调用栈会产生一次空间消耗,那么需要分析调用了几次:二叉树高度乘以?
时间复杂度
两种方案,均为最坏情况下考虑。
数学归纳法
每一次调用均有4次子调用,底数为4。
- 树高一层 => 1
- 树高二层 => 4
- 树高三层 => 节点4 *4次比对 => 16
- 则树高N时 =>
- 层高为N的二叉树比对次数之和为
2.优化时间复杂度
证明底数不必为4,2或者3