返回
技术分析:探索二叉树翻转的奥秘-- LeetCode 第543 题详解
前端
2023-12-25 06:13:15
[技术分享]
LeetCode 第 543 题:翻转二叉树
前言
欢迎各位读者来到 LeetCode 算法题解之旅的下一站--第 543 题:翻转二叉树。这道题看似简单,实则蕴含着二叉树遍历和算法设计方面的深刻知识,非常值得深入研究。
问题
给定一棵二叉树,要求将其翻转。具体来说,就是将二叉树中的所有左子树和右子树互换。
举个例子,如果给定以下二叉树:
1
/ \
2 3
/ \ /
4 5 6
翻转之后,二叉树将变成:
1
/ \
3 2
/ \ /
6 5 4
解法
方法一:深度优先搜索(DFS)
这道题最常用的解法是使用深度优先搜索(DFS)算法。DFS 算法是一种递归算法,它从根节点开始,依次访问每个节点及其子节点,直到访问完所有节点为止。
在 DFS 算法中,我们可以使用以下步骤来翻转二叉树:
- 首先检查当前节点是否为空。如果是,则直接返回。
- 如果当前节点不为空,则先将当前节点的左右子树互换。
- 然后,分别对当前节点的左子树和右子树进行 DFS 遍历。
使用 DFS 算法可以保证我们遍历二叉树中的所有节点,并且可以有效地将二叉树翻转。
def invert_tree(root):
if root is None:
return None
# 将当前节点的左右子树互换
root.left, root.right = root.right, root.left
# 对当前节点的左子树和右子树进行 DFS 遍历
invert_tree(root.left)
invert_tree(root.right)
return root
方法二:广度优先搜索(BFS)
除了 DFS 算法之外,我们还可以使用广度优先搜索(BFS)算法来翻转二叉树。BFS 算法是一种队列算法,它从根节点开始,将所有相邻节点加入队列,然后依次访问队列中的节点,直到访问完所有节点为止。
在 BFS 算法中,我们可以使用以下步骤来翻转二叉树:
- 首先将根节点加入队列。
- 然后,依次从队列中取出节点,并将其左右子树互换。
- 将当前节点的左右子树加入队列。
使用 BFS 算法也可以保证我们遍历二叉树中的所有节点,并且可以有效地将二叉树翻转。
def invert_tree(root):
if root is None:
return None
# 创建一个队列,并将根节点加入队列
queue = [root]
# 循环遍历队列中的节点
while queue:
# 从队列中取出当前节点
current_node = queue.pop(0)
# 将当前节点的左右子树互换
current_node.left, current_node.right = current_node.right, current_node.left
# 将当前节点的左右子树加入队列
if current_node.left is not None:
queue.append(current_node.left)
if current_node.right is not None:
queue.append(current_node.right)
return root
总结
在本文中,我们介绍了两种翻转二叉树的算法:DFS 算法和 BFS 算法。这两种算法都可以有效地将二叉树翻转,但是它们在遍历二叉树的方式上有所不同。DFS 算法采用递归的方式遍历二叉树,而 BFS 算法采用队列的方式遍历二叉树。读者可以根据自己的需要选择合适的方法来翻转二叉树。