​面试经典150题——翻转二叉树

时间:2024-04-20 18:55:55

1. 题目描述

2.  题目分析与解析

分析题目可以看出,其实就是从下到上的左右节点互换操作,其实上也是可以进行递归操作的,这是因为每一个子操作和父操作都是一样的方式。

解题思路

  1. 空树情况处理: 首先检查根节点是否为空。如果根节点为空,则直接返回 null,因为空树的翻转也是空树。

  2. 递归交换左右子树: 如果根节点不为空,则递归地对左右子树进行翻转。这里的递归调用是算法的核心部分。在每次递归调用中,我们交换当前节点的左右子树。这里用一个临时变量 temp 保留右子树,以免交换后丢失右子树。

  3. 返回根节点: 递归的终止条件是当前节点为空,也就是叶子节点的左右子树为空。当递归到叶子节点时,开始回溯,将叶子节点返回,并逐层向上返回翻转后的子树。

整体来说,这个算法的思路是从根节点开始,递归地对整棵树进行翻转。对于每个节点,将其左右子树交换后,再递归地翻转其左右子树。通过递归的方式,直到所有节点都被处理完毕,最终返回翻转后的根节点。

这个算法是一种典型的深度优先搜索(DFS)的应用,利用递归实现了对树的遍历和操作。

3. 代码实现

4. 相关复杂度分析

  1. 时间复杂度:

    • 递归函数在每个节点上执行恰好一次,因此总的时间复杂度是 O(n),其中 n 是树中节点的数量。这是因为算法会遍历每个节点,并且在每个节点上执行恰好一次的交换操作。

  2. 空间复杂度:

    • 空间复杂度取决于递归调用的栈空间。在最坏情况下,递归调用的最大深度等于树的高度。因此,空间复杂度为 O(h),其中 h 是树的高度。

    • 如果树是平衡二叉树,树的高度近似为 log(n),其中 n 是树中节点的数量,因此空间复杂度为 O(log(n))。

    • 如果树是不平衡的,最坏情况下树的高度等于节点数量 n,空间复杂度为 O(n)。

综上所述,该算法的时间复杂度为 O(n),空间复杂度取决于树的高度,在最坏情况下为 O(n),在平衡树的情况下为 O(log(n))。