可视化图解算法30:二叉树的镜像
1. 题目
描述
操作给定的二叉树,将其变换为源二叉树的镜像。
数据范围:二叉树的节点数 0 ≤n≤1000 , 二叉树每个节点的值 0≤val≤1000
要求: 空间复杂度 O(n)。本题也有原地操作,即空间复杂度 O(1) 的解法,时间复杂度 O(n)
比如:
源二叉树
镜像二叉树
示例1
输入:
{8,6,10,5,7,9,11}
返回值:
{8,10,6,11,9,7,5}
说明:
如题面所示
示例2
输入:
{}
返回值:
{}
2. 解题思路
对于二叉树的镜像,我们只需要将二叉树每个节点对应的左右子树互换。可以采用递归的方法。
先来看看是否满足递归的两个条件:
可以看出,求解二叉树的镜像满足递归的两个条件,因此可以采用递归来求解二叉树的镜像。
二叉树的镜像是指将二叉树的所有节点的左右子树进行对称交换,使得最终的树结构与原树关于“根节点轴线”对称。镜像后的树与原树互为镜像,类似于照镜子后的效果。
假设有如下二叉树:
1 / \ 2 3 / \ / \ 4 5 6 7
它的镜像二叉树为:
1 / \ 3 2 / \ / \ 7 6 5 4
可以看到,每个节点的左右子树被交换,且子树内部也递归地进行了镜像操作。
求解一颗二叉树的镜像,只需要对原二叉树每个节点的左右子树进行互换,因此对应的递推公式如下:
如果文字描述的不太清楚,你可以参考视频的详细讲解。
- Python版本:https://www.bilibili.com/cheese/play/ep1372110
- Java版本:https://www.bilibili.com/cheese/play/ep1367349
- Golang版本:https://www.bilibili.com/cheese/play/ep1364774
3. 编码实现
核心代码如下:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return TreeNode类
*/
func Mirror(pRoot *TreeNode) *TreeNode {
// write code here
// 2. 递归终止条件
if pRoot == nil {
return nil
}
// 1. 问题分解(递推公式)
// 1.1 root节点处理:左右子树互换
pRoot.Left, pRoot.Right = pRoot.Right, pRoot.Left
// 1.2 对左子树进行处理
Mirror(pRoot.Left)
// 1.3 对右子树进行处理
Mirror(pRoot.Right)
return pRoot
}
具体完整代码你可以参考下面视频的详细讲解。
- Python版本:https://www.bilibili.com/cheese/play/ep1372110
- Java版本:https://www.bilibili.com/cheese/play/ep1367349
- Golang版本:https://www.bilibili.com/cheese/play/ep1364774
4.小结
对于二叉树的镜像,我们只需要将二叉树每个节点对应的左右子树互换。可以采用递归的方法。
《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:
✅ 链表
✅ 二叉树
✅ 二分查找、排序
✅ 堆、栈、队列
✅ 回溯算法
✅ 哈希算法
✅ 动态规划
无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!
- Python编码实现:https://www.bilibili.com/cheese/play/ss897667807
- Java编码实现:https://www.bilibili.com/cheese/play/ss161443488
- Golang编码实现:https://www.bilibili.com/cheese/play/ss63997
对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。
今日佳句:白发三千丈,缘愁似个长。不知明镜里,何处得秋霜。