数据结构与算法之 leetcode 二叉树镜像 递归 / 迭代生成

数据结构与算法阿木 发布于 2025-07-12 12 次阅读


二叉树镜像:递归与迭代两种实现方式

在数据结构与算法的学习过程中,二叉树是一个非常重要的数据结构。它广泛应用于计算机科学中的各种场景,如二叉搜索树、堆、平衡树等。二叉树镜像问题是一个经典的二叉树操作问题,要求我们交换二叉树中所有节点的左右子树。本文将围绕二叉树镜像问题,分别介绍递归和迭代两种实现方式,并分析它们的优缺点。

1. 问题分析

二叉树镜像问题可以描述如下:

给定一个二叉树,我们需要将其转换成镜像二叉树。在镜像二叉树中,每个节点的左右子树与原二叉树中的左右子树相反。

例如,给定以下二叉树:


1


/


2 3


/


4 5


其镜像二叉树为:


1


/


3 2


/


5 4


2. 递归实现

递归是一种常用的算法设计方法,它通过将问题分解为更小的子问题来解决原问题。下面是使用递归方法实现二叉树镜像的代码:

python

class TreeNode:


def __init__(self, val=0, left=None, right=None):


self.val = val


self.left = left


self.right = right

def mirror_tree(root):


if root:


交换左右子树


root.left, root.right = mirror_tree(root.right), mirror_tree(root.left)


return root

创建二叉树


root = TreeNode(1)


root.left = TreeNode(2)


root.right = TreeNode(3)


root.left.left = TreeNode(4)


root.left.right = TreeNode(5)

打印原二叉树


def print_tree(node):


if node:


print(node.val, end=' ')


print_tree(node.left)


print_tree(node.right)

print("原二叉树:")


print_tree(root)

镜像二叉树


mirror_root = mirror_tree(root)

打印镜像二叉树


print("镜像二叉树:")


print_tree(mirror_root)


递归实现分析

递归实现具有以下优点:

1. 代码简洁,易于理解。

2. 递归方法可以自然地表达问题的分解过程。

递归实现也存在以下缺点:

1. 递归方法可能导致栈溢出,特别是对于深度较大的二叉树。

2. 递归方法的空间复杂度较高,因为每次递归调用都会占用栈空间。

3. 迭代实现

迭代方法通常使用栈或队列来实现。下面是使用栈实现二叉树镜像的代码:

python

class TreeNode:


def __init__(self, val=0, left=None, right=None):


self.val = val


self.left = left


self.right = right

def mirror_tree_iterative(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

创建二叉树


root = TreeNode(1)


root.left = TreeNode(2)


root.right = TreeNode(3)


root.left.left = TreeNode(4)


root.left.right = TreeNode(5)

打印原二叉树


print("原二叉树:")


print_tree(root)

镜像二叉树


mirror_root = mirror_tree_iterative(root)

打印镜像二叉树


print("镜像二叉树:")


print_tree(mirror_root)


迭代实现分析

迭代实现具有以下优点:

1. 空间复杂度较低,不会因为递归调用而占用大量栈空间。

2. 适用于深度较大的二叉树,不会导致栈溢出。

迭代实现也存在以下缺点:

1. 代码相对复杂,不如递归方法简洁。

2. 需要手动管理栈,增加了代码的复杂性。

4. 总结

本文介绍了二叉树镜像问题的递归和迭代两种实现方式。递归方法代码简洁,易于理解,但存在栈溢出和空间复杂度高的缺点。迭代方法空间复杂度较低,适用于深度较大的二叉树,但代码相对复杂。在实际应用中,可以根据具体情况选择合适的实现方式。