LeetCode中如何翻转二叉树

发布时间:2021-12-04 15:44:38 作者:小新
来源:亿速云 阅读:162
# LeetCode中如何翻转二叉树

## 引言

翻转二叉树(Invert Binary Tree)是LeetCode上一道经典的二叉树问题(题目编号226)。它不仅考察了对二叉树结构的理解,也是递归和迭代算法思想的典型应用场景。本文将详细解析翻转二叉树的多种解法,并探讨其时间复杂度和应用场景。

---

## 问题描述

**题目要求**:给定一个二叉树的根节点 `root`,翻转这棵二叉树的所有左右子树,并返回翻转后的根节点。

**示例**:

输入: 4 /
2 7 / \ /
1 3 6 9

输出: 4 /
7 2 / \ /
9 6 3 1


---

## 解法一:递归法(DFS)

### 算法思路
递归是最直观的解法,通过深度优先搜索(DFS)遍历二叉树的每个节点,并交换其左右子树。

### 代码实现
```python
def invertTree(root):
    if not root:
        return None
    # 交换左右子树
    root.left, root.right = root.right, root.left
    # 递归处理左右子树
    invertTree(root.left)
    invertTree(root.right)
    return root

复杂度分析


解法二:迭代法(BFS)

算法思路

使用广度优先搜索(BFS)逐层遍历二叉树,利用队列存储待处理的节点,依次交换其左右子树。

代码实现

from collections import deque

def invertTree(root):
    if not root:
        return None
    queue = deque([root])
    while queue:
        node = queue.popleft()
        # 交换左右子树
        node.left, node.right = node.right, node.left
        # 将子节点加入队列
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)
    return root

复杂度分析


解法三:迭代法(DFS)

算法思路

通过栈模拟递归的深度优先搜索,显式地控制遍历顺序。

代码实现

def invertTree(root):
    if not root:
        return None
    stack = [root]
    while stack:
        node = stack.pop()
        # 交换左右子树
        node.left, node.right = node.right, node.left
        # 将子节点压入栈
        if node.left:
            stack.append(node.left)
        if node.right:
            stack.append(node.right)
    return root

复杂度分析


解法四:Morris遍历

算法思路

Morris遍历是一种空间复杂度为O(1)的算法,通过临时修改树的结构实现遍历。

代码实现

def invertTree(root):
    current = root
    while current:
        if current.left:
            # 找到左子树的最右节点
            predecessor = current.left
            while predecessor.right:
                predecessor = predecessor.right
            # 将当前节点右子树接到最右节点
            predecessor.right = current.right
            # 移动左子树到右侧
            current.right = current.left
            current.left = None
        # 移动到右子树(原左子树)
        current = current.right
    return root

复杂度分析


边界条件与注意事项

  1. 空树处理:当输入为 None 时直接返回。
  2. 单节点树:无需交换,直接返回根节点。
  3. 性能优化:递归法在树深度较大时可能导致栈溢出,迭代法更安全。

应用场景

  1. 镜像对称树检测:翻转后与原树对比可判断是否对称。
  2. 数据结构的教学案例:帮助理解二叉树遍历和指针操作。

总结

解法 时间复杂度 空间复杂度 适用场景
递归法 O(n) O(h) 代码简洁
BFS迭代法 O(n) O(w) 层次遍历需求
DFS迭代法 O(n) O(h) 模拟递归过程
Morris遍历 O(n) O(1) 空间限制严格场景

根据实际需求选择合适的解法,递归法适合面试快速实现,迭代法更适合工程场景。


扩展思考

  1. 如何验证翻转后的树是否正确?
  2. 如果要求原地修改(不新建节点),如何调整算法?
  3. 非二叉树(如三叉树)的翻转如何实现?

”`

(全文约1300字)

推荐阅读:
  1. leetcode--字符串翻转
  2. leetcode--翻转二叉树

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

leetcode

上一篇:常用的ADO管理函数有哪些

下一篇:MySQL图形化管理工具Navicat怎么安装

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》