导语:
有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。
二叉树是一种非常基础且重要的数据结构,而翻转二叉树是二叉树类题目中非常经典的一道。虽然简单,但是可以很好的检验大家的算法基础。翻转二叉树的详情如下,即将左边的二叉树翻转为右边的结构:
一.思路
二叉树的遍历方式分为广度优先遍历和深度优先遍历,这里我们可以采用广度优先搜索(BFS)的方式来遍历整棵树,并且通过在每次遍历时,交换每个节点的左右子节点,进而实现翻转。
二.代码
根据以上思路,代码如下
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
# 如果根节点为空,直接返回空
if root is None:
return None
# 创建一个双向队列,并将根节点作为初始元素添加到队列中
queue = collections.deque([root])
# 当队列不为空时,继续进行翻转操作
while len(queue) > 0:
# 从队列的左侧取出当前节点
cur_node = queue.popleft()
# 如果当前节点不为空
if cur_node is not None:
# 交换当前节点的左右子节点
cur_node.left, cur_node.right = cur_node.right, cur_node.left
# 将交换后的左右子节点添加到队列中,以便后续继续翻转它们的子节点
queue.append(cur_node.left)
queue.append(cur_node.right)
# 返回翻转后的根节点
return root
三.递归法实现翻转二叉树
以上是迭代法实现二叉树翻转的代码,除此之外,使用递归的方法也可以实现翻转二叉树的功能,代码如下
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
# 如果根节点为空,直接返回空
if not root:
return None
# 递归调用,翻转左子树
self.invertTree(root.left)
# 递归调用,翻转右子树
self.invertTree(root.right)
# 交换当前节点的左右子节点
root.left, root.right = root.right, root.left
# 返回翻转后的根节点
return root
由于实现二叉树翻转相对简单,所以有很多种方法都可以实现,同学们可以仔细比较迭代法和递归法的区别,以及分别使用前序遍历,中序遍历,后续遍历的方法实现二叉树的翻转,这里就不多介绍了。