您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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)逐层遍历二叉树,利用队列存储待处理的节点,依次交换其左右子树。
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
通过栈模拟递归的深度优先搜索,显式地控制遍历顺序。
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遍历是一种空间复杂度为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
None
时直接返回。解法 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|
递归法 | O(n) | O(h) | 代码简洁 |
BFS迭代法 | O(n) | O(w) | 层次遍历需求 |
DFS迭代法 | O(n) | O(h) | 模拟递归过程 |
Morris遍历 | O(n) | O(1) | 空间限制严格场景 |
根据实际需求选择合适的解法,递归法适合面试快速实现,迭代法更适合工程场景。
”`
(全文约1300字)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。