某智驾三面C++开发复盘

73 阅读1分钟

面试官自创的非常灵活的一道中等题,引发了博主比较深的思考,特此小记一番。

题目

有两棵二叉树,当两树对应位置元素相同时,或者旋转左右子树能让两树对应位置元素相同时,则判定两二叉树相似。

思路

递归 需要处理的子问题有以下两种情况:

  • 两子树对应位置元素是否相同
  • 两子树旋转后对应位置是否相同

边界处理就是:

  1. 两树中有一个为空树一个不是
  2. 两树都是空树
  3. 两树元素不相同

那么可得 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时 => O(4N1)O(4^{N-1})
  • 层高为N的二叉树比对次数之和为(1+4+16+64+...+4N1)=4N(1+4+16+64+...+4^{N-1}) = 4^N

2.优化时间复杂度

证明底数不必为4,2或者3