当前位置:首页 > Go > 正文

Go语言实现二叉树的镜像(从零开始掌握递归与指针操作)

Go语言中,二叉树是一种非常基础且重要的数据结构。今天我们要学习的是如何实现镜像二叉树——即将一棵二叉树左右翻转,使其变成“照镜子”后的样子。无论你是刚接触编程的新手,还是想巩固算法基础的开发者,这篇教程都将带你一步步理解并实现这个经典问题。

什么是二叉树的镜像?

想象你站在一棵二叉树前,面前有一面镜子。镜子里看到的树就是原树的镜像:每个节点的左子树和右子树互换了位置。

Go语言实现二叉树的镜像(从零开始掌握递归与指针操作) Go语言 二叉树 镜像二叉树 数据结构 第1张

例如,原始树结构如下:

    1   / \  2   3 / \4   5  

其镜像为:

    1   / \  3   2     / \    5   4  

Go语言中的二叉树定义

首先,我们需要在 Go 中定义一个二叉树节点结构。每个节点包含值(Val)、左子节点(Left)和右子节点(Right)。

type TreeNode struct {    Val   int    Left  *TreeNode    Right *TreeNode}

实现镜像函数

要实现镜像,最直观的方法是使用递归。思路如下:

  • 如果当前节点为空,直接返回(递归终止条件)。
  • 交换当前节点的左子树和右子树。
  • 对左子树和右子树分别递归执行镜像操作。

下面是完整的 Go 代码实现:

package mainimport "fmt"type TreeNode struct {    Val   int    Left  *TreeNode    Right *TreeNode}// mirrorTree 实现二叉树的镜像func mirrorTree(root *TreeNode) *TreeNode {    if root == nil {        return nil    }    // 交换左右子树    root.Left, root.Right = root.Right, root.Left    // 递归处理左右子树    mirrorTree(root.Left)    mirrorTree(root.Right)    return root}// 辅助函数:中序遍历打印树(用于验证结果)func inorderTraversal(root *TreeNode) []int {    if root == nil {        return []int{}    }    left := inorderTraversal(root.Left)    right := inorderTraversal(root.Right)    return append(append(left, root.Val), right...)}func main() {    // 构建示例树:    //       1    //      / \    //     2   3    //    / \    //   4   5    root := &TreeNode{Val: 1}    root.Left = &TreeNode{Val: 2}    root.Right = &TreeNode{Val: 3}    root.Left.Left = &TreeNode{Val: 4}    root.Left.Right = &TreeNode{Val: 5}    fmt.Println("原树中序遍历:", inorderTraversal(root))    mirrorTree(root)    fmt.Println("镜像后中序遍历:", inorderTraversal(root))}

运行结果说明

运行上述代码,你会看到输出:

原树中序遍历: [4 2 5 1 3]镜像后中序遍历: [3 1 5 2 4]

这说明我们的镜像函数成功地将左右子树进行了交换。

为什么这个方法有效?

关键在于递归指针操作。Go 语言中的结构体指针允许我们直接修改内存中的节点关系。通过先交换当前节点的左右指针,再递归处理子树,我们确保了整棵树被完整翻转。

小结

通过本教程,你已经学会了如何在 Go语言 中实现 二叉树的镜像。这项技能不仅加深了你对 数据结构 的理解,也锻炼了递归思维和指针操作能力。掌握 镜像二叉树 是迈向更复杂树形算法(如平衡树、BFS/DFS)的重要一步。

继续练习吧!尝试用迭代方式实现镜像,或者扩展功能支持任意深度的树。