class Solution:
def mirrorTree(self, root: TreeNode) -> TreeNode:
if not root: return root
num = [root]
while num:
tem = num.pop(0)
if tem.left:num.append(tem.left)
if tem.right:num.append(tem.right)
tem.left,tem.right = tem.right,tem.left
return root
递归还是不好想呀,练的太少了,慢慢来比较快
class Solution:
def mirrorTree(self, root: TreeNode) -> TreeNode:
if not root: return
root.left ,root.right = root.right,root.left
self.mirrorTree(root.left)
self.mirrorTree(root.right)
return root
class Solution:
def mirrorTree(self, root: TreeNode) -> TreeNode:
if not root:
return root
left = self.mirrorTree(root.left)
right = self.mirrorTree(root.right)
root.left, root.right = right, left
return root
class Solution:
def mirrorTree(self, root: TreeNode) -> TreeNode:
if not root:
return root
left = self.mirrorTree(root.left)
right = self.mirrorTree(root.right)
root.left,root.right = right,left
return root
var mirrorTree = function(root) {
if(!root) return root;
let left = mirrorTree(root.left);
let right = mirrorTree(root.right);
root.left = right;
root.right = left;
return root;
};
共以下 55 个回答
时间复杂度O(N),空间复杂度树的高度,最差情况下O(N)
递归,交换,没什么好说的 O(N)
C++
思路:层序遍历,交换左右节点
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode mirrorTree(TreeNode* root) {
if(root NULL) return root;
if(root && root->left NULL && root->right NULL) return root;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()) {
TreeNode *now = q.front();
q.pop();
if(now->left && now->right) {
TreeNode *temp = now->left;
now->left = now->right;
now->right = temp;
q.push(now->left);
q.push(now->right);
}else if(now->left && !now->right) {
now->right = now->left;
now->left = NULL;
q.push(now->right);
}else if(!now->left && now->right) {
now->left = now->right;
now->right = NULL;
q.push(now->left);
}
}
return root;
}
};
思路: 递归+左右交换节点
时间O(n) 空间O(n)
递归版简单,来个迭代版的
递归
思路:
递归三要素:
1. 明确你这个函数想要干什么: 交换左子树和右子树的节点
2. 寻找递归结束条件: 递归到叶子节点的左右子节点,因为是叶子节点,所以节点为null时结束递归
3. 找出函数的等价关系式 :左右子节点交换并返回父节点
镜像交给递归函数,交换左右节点,base是当节点的左右均为空时直接返回。
思路
根不为空时,左子树旋转,右子树旋转,根左连右子树,根右连左子树
左旋转即为将左结点递归,右边同理
时间复杂度 O(n)
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度:O(n)
空间复杂度:O(n) (递归栈)
时间复杂度:O(N)
空间复杂度:O(N)
解题思路:
递归解析:
终止条件: 当节点 rootroot 为空时(即越过叶节点),则返回 nullnull ;
递推工作:
初始化节点 tmptmp ,用于暂存 rootroot 的左子节点;
开启递归 右子节点 mirrorTree(root.right)mirrorTree(root.right) ,并将返回值作为 rootroot 的 左子节点 。
开启递归 左子节点 mirrorTree(tmp)mirrorTree(tmp) ,并将返回值作为 rootroot 的 右子节点 。
返回值: 返回当前节点 rootroot ;
思路就是用递归解决,只不过实现方式不同。
方式一:后序遍历的节点访问顺序,递归地得到已经处理好的左、右子树的根节点并交换处理。时间复杂度O(N),空间复杂度区间于递归的次数,而递归的次数又取决于树的高度。
方式二:不用得到已经镜像后的左右子树的节点,而是在遍历节点的同时,交换遍历节点的左右子节点。时间复杂度O(N),空间复杂度还是取决于树的高度。
前序遍历
后序遍历
中序遍历(有些特殊,因为中的时候已经交换了左右节点,所以后面还要对root.left处理,而不是root.right,刚开始时我是处理的root.right,可以画图或调试找出错误)
遍历,然后交换左右子节点,时间O(n),空间O(n)
时间复杂度On
空间复杂度On
学习新思想,做好每一题
辅助栈思想,前面的求深度也是类似的思想,迭代遍历 时间复杂度O(0),空间复杂度O(n)
一.剑指 Offer 27. 二叉树的镜像
思路:递归该二叉树,然后在返回的时候把他的左右子数进行交换即可
时间复杂度:O(n)
额
解题思路:使用深度优先方法递归遍历二叉树,交换每个节点的左右子节点,直到子节点为None。
时间复杂度:O(n)
空间复杂度:O(n)
时间 空间 O(n)
迭代,用一个结点来保存,防止丢失。
左右子树交换
后序遍历,对每一个子树进行镜像
时间O(n),空间O(n)
空间复杂度O(n)
时间复杂度O(n)
//recursion递归
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(!root) return nullptr;
mirrorTree(root->left);
mirrorTree(root->right);
swap(root->left,root->right);
return root;
};
时间:O(n)
空间:O(n)
递归交换叶子结点
时间O(n)
空间O(n)
递归真的是太抽象了
递归的返回条件还是有点迷糊,需要再仔细多看看递归
时间复杂度O(N)会遍历每一个节点 空间复杂度O(N) 一般情况下遍历深度为logn,最坏情况下为链表o(N)
递归
栈迭代
队列迭代
1、判断特殊情况,当根节点为空或者根节点的左右节点为空时,直接返回根节点
2、无特殊情况,则采用递归,分别镜像根节点的左右节点
3、根的左右指针进行重新指向
时间复杂度为O(n),空间复杂度为O(lgn)
递归,和深搜的操作没有区别
时间 O(n)
空间 O(1)
时间:O(n),空间:O(n)