当前位置: 首页剑指offer刷题第五期问题详情 【二叉树专题】剑指 Offer 27. 二叉树的镜像 本问题对应课程链接:剑指offer刷题第五期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 23 个回答
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(root NULL)
{
return NULL;
}
TreeNode* left = mirrorTree(root->left);
TreeNode* right = mirrorTree(root->right);
root->right = left;
root->left = right;
return root;
}
};
时间复杂度:O(n),空间复杂度:O(n)
// 定义二叉树节点结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 递归实现二叉树镜像
void mirrorTree(TreeNode* root) {
if (root NULL) {
return;
}
// 递归处理左子树和右子树,交换左右子树的值
TreeNode* left = root->left;
root->left = root->right;
root->right = left;
// 递归处理左子树和右子树,交换左右子树的值
mirrorTree(root->left);
mirrorTree(root->right);
}//时间复杂度O(n),空间复杂度O(n)
class Solution:
def mirrorTree(self, root: TreeNode) -> TreeNode:
if not root:
return root
TreeNode* left = mirrorTree(root.left)
TreeNode* right= mirrorTree(root.right)
root.left = right
root.right = left
return root
时间复杂度:O(N)
空间复杂度:O(N)
时间复杂度o(n)
···
/**
* 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 nullptr) return nullptr;
TreeNode *left = mirrorTree(root->left);
TreeNode *right = mirrorTree(root->right);
root->left = right;
root->right = left;
return root;
}
};
···
class Solution{
public: Treenode *mirrorTree(Treenode *root)
{
//当二叉树只有一边的时候没有镜像
if(root NULL||root->rightNULL&&root->leftNULL)
return root;
//递归
TreeNode *left= mirrorTree(root->left);
TreeNode *right= mirrorTree(root->right);
root->left = right;//将右叉树的值给左叉树
root->right= left;//将左叉树的值给右叉树
return root;
};
}
复杂度O(n)
打卡
时间复杂度O(n)
空间复杂度O(1)
时间复杂度O(n)
空间复杂度O(n)
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(rootNULL) return NULL;
TreeNode* left=mirrorTree(root->left);
TreeNode* right=mirrorTree(root->right);
root->left=right;
root->right=left;
return root;
}
};
时间复杂度O(n) 空间复杂度O(n)
”’java
//二叉树的镜像
public TreeNode mirrorTree(TreeNode root) {
if(root null) return null;
時間複雜度: O(n) 空間複雜度: O(n) 依照遞迴的層數, 這邊n為總節點數量
遞迴遍歷 左右子樹, 一直到兩邊都到盡頭, 此時對於根節點左右只有各一個節點, 只需要將左右兌換一下即可
做俩中间值,leftright暂存,后面继续相反赋值递归到空;
“`c
struct TreeNode* mirrorTree(struct TreeNode* root){
if(rootNULL){
return NULL;
}
struct TreeNode* left= mirrorTree(root->left);
struct TreeNode* right = mirrorTree(root->right);
root->left=right;
root->right=left;
return root;
}
#自己写出来的递归加1
class Solution:
def mirrorTree(self, root: TreeNode) -> TreeNode:
if not root: return None
mirror_tree = TreeNode(root.val)
mirror_tree.left = self.mirrorTree(root.right)
mirror_tree.right = self.mirrorTree(root.left)
递归
1、递归
2、层次遍历
一开始我是这么写的,结果不对。
问题出在这两行代码上:
当完成第一行的执行后,root.left 的值已经被改变了。因此,在第二行调用 mirrorTree(root.left) 时,实际上是在调用已经被镜像过的右子树,应该首先保存原始的左右子树的引用,然后进行交换。这样可以避免此类问题。下面是修正后的代码:
时间复杂度O(n), 空间复杂度O(n)