开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情
Day29 2023/02/05
难度:简单
题目
操作给定的二叉树,将其变换为源二叉树的镜像。
数据范围:二叉树的节点数 0≤n≤1000 , 二叉树每个节点的值 0≤val≤1000
要求: 空间复杂度O(n) 。本题也有原地操作,即空间复杂度 O(1) 的解法,时间复杂度 O(n)
比如:
源二叉树
镜像二叉树
示例
输入:{8,6,10,5,7,9,11}
返回值:{8,10,6,11,9,7,5}
说明:实现了镜像操作
思路
根据二叉树镜像的形式,可以考虑使用递归的方式,从根结点开始,交换它左右子节点,同依次遍历交换每棵子树的左右节点。
具体步骤:
- 判断二叉树是否为空,若为空返回nullptr
- 交换左右子树
- 分别递归左子树和右子树
- 返回根节点
关键点
- 递归法只要将一个大问题划分为若干相同的小问题,就基本做出来了。
算法实现
c++代码实现-递归法
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
TreeNode* Mirror(TreeNode* pRoot) {
if (!pRoot) return pRoot; //判空操作
swap(pRoot->left, pRoot->right); //交换左右子树
Mirror(pRoot->left); //递归左子树
Mirror(pRoot->right); //递归右子树
return pRoot; //返回根节点
}
};
- 时间复杂度 --- 遍历整个二叉树,n为二叉树的节点数
- 空间复杂度 --- 最坏情况下,二叉树为链表型,递归调用栈的深度为二叉树节点数n。
总结
- 本题还可以使用辅助队列的方式,二叉树类的题目大多的解题思路就是递归法和使用辅助队列的形式。
- 本题的进阶形式空间复杂度仅为,有会的大佬可以评论一下!!!感激。