返回

技术分析:探索二叉树翻转的奥秘-- LeetCode 第543 题详解

前端

[技术分享]

LeetCode 第 543 题:翻转二叉树


前言

欢迎各位读者来到 LeetCode 算法题解之旅的下一站--第 543 题:翻转二叉树。这道题看似简单,实则蕴含着二叉树遍历和算法设计方面的深刻知识,非常值得深入研究。

问题

给定一棵二叉树,要求将其翻转。具体来说,就是将二叉树中的所有左子树和右子树互换。

举个例子,如果给定以下二叉树:

     1
    / \
   2   3
  / \  /
 4   5 6

翻转之后,二叉树将变成:

     1
    / \
   3   2
  / \  /
 6   5 4

解法

方法一:深度优先搜索(DFS)

这道题最常用的解法是使用深度优先搜索(DFS)算法。DFS 算法是一种递归算法,它从根节点开始,依次访问每个节点及其子节点,直到访问完所有节点为止。

在 DFS 算法中,我们可以使用以下步骤来翻转二叉树:

  1. 首先检查当前节点是否为空。如果是,则直接返回。
  2. 如果当前节点不为空,则先将当前节点的左右子树互换。
  3. 然后,分别对当前节点的左子树和右子树进行 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 算法中,我们可以使用以下步骤来翻转二叉树:

  1. 首先将根节点加入队列。
  2. 然后,依次从队列中取出节点,并将其左右子树互换。
  3. 将当前节点的左右子树加入队列。

使用 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 算法采用队列的方式遍历二叉树。读者可以根据自己的需要选择合适的方法来翻转二叉树。