剑指 Offer 27. 二叉树的镜像
个人思路
题意
镜像:根结点的左右子节点交换位置,即为镜像
个人错误思路
根据给出的用例,一开始理解成了是对二叉树逆层序遍历,即先右子节点再左子节点,这个思路只是对满二叉树适用
正确思路
对根节点的左右子节点交换,递归遍历左右子节点做相同的操作
个人错误思路代码
/**
* 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:
vector<TreeNode*> vec;
TreeNode* mirrorTree(TreeNode* root) {
vec.push_back(NULL);
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
int len = q.size();
for(int i = 0; i < len; ++i){
TreeNode* top = q.front();
q.pop();
if(top){
vec.push_back(top);
q.push(top->right);//先右子节点再左子节
q.push(top->left);
}else{
vec.push_back(NULL);
}
}
}
for(int i = 1; i < vec.size(); ++i){
if(vec[i] != NULL){
if(2 * i <= vec.size()){
vec[i]->left = vec[2 * i];
}
if(2 * i + 1 <= vec.size()){
vec[i]->right = vec[2 * i + 1];
}
cout << vec[i]->val << " ";
}
else
cout << "null ";
}
return vec[1];
}
};
正确思路代码
/**
* 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;
}
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
if(root->left){
root->left = mirrorTree(root->left);
}
if(root->right){
root->right = mirrorTree(root->right);
}
return root;
}
};