返回

翻转二叉树,妙招尽在掌握!

前端

翻转二叉树,顾名思义,就是将一颗二叉树的左右子树进行互换,从而得到一棵新的二叉树。这道算法题看似简单,实则蕴含着深刻的思想和技巧。掌握翻转二叉树的解法,不仅能锻炼你的算法能力,还能加深你对二叉树的理解。

一、递归法

递归法是一种经典的算法解决方法,它通过不断地将问题分解成更小的子问题,直至子问题能够轻松解决,然后逐层往上回溯,最终得到整个问题的解。在翻转二叉树问题中,我们可以采用以下步骤进行递归求解:

  1. 递归终止条件:如果当前节点为空,则无需翻转,直接返回。
  2. 递归过程:对于当前节点,首先翻转其左右子树,然后将左右子树互换。最后,返回翻转后的当前节点。

代码实现:

def invertTree(root):
    if not root:
        return None

    # 翻转左右子树
    left = invertTree(root.left)
    right = invertTree(root.right)

    # 互换左右子树
    root.left = right
    root.right = left

    # 返回翻转后的当前节点
    return root

二、迭代法

迭代法是一种非递归的算法解决方法,它通过不断地迭代操作,逐步逼近问题的解。在翻转二叉树问题中,我们可以采用以下步骤进行迭代求解:

  1. 初始化一个栈,将根节点压入栈中。
  2. 循环执行以下步骤:
    • 从栈中弹出当前节点。
    • 翻转当前节点的左右子树。
    • 将当前节点的左右子树压入栈中。
  3. 直到栈为空时,循环结束。

代码实现:

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

结语

翻转二叉树,看似简单,实则蕴含着深刻的算法思想和技巧。通过递归和迭代两种方法的介绍,希望你能对二叉树的理解更加深刻,算法能力也更加娴熟。快来动手实践,巩固你的算法功底吧!