题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像
二叉树的结点定义如下:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x)
:val(x)
, left(NULL)
, right(NULL)
{}
};
原树
镜像后
函数实现:
//递归思路先遍历二叉树数 当有叶子结点时交换其叶子结点 当叶子结点为空时返回
class solution{
public:
void MirroRecursively(TreeNode* root)
{
if(root==NULL)
return ;
if(root->left==NULL&&root->right==NULL)
return;
TreeNode* tmp=root->left;
root->left=root->right;
root->right=tmp;
if(root->left)
MirroRecursively(root->left);
if(root->right)
MirroRecursively(root->right);
}
};
//非递归思路我们可以借助栈或者队列
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot==NULL)
return ;
TreeNode* p=NULL;
stack<TreeNode*> sta;
sta.push(pRoot);
while(sta.size()>0)
{
p=sta.top();
sta.pop();
TreeNode* tmp=p->left;
p->left=p->right;
p->right=tmp;
if(p->left)
sta.push(p->left);
if(p->right)
sta.push(p->right);
}
}
};
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if (pRoot == NULL)return;
queue<TreeNode*> qu;
TreeNode* p = NULL;
qu.push(pRoot);
while (qu.size())
{
p = qu.front();
qu.pop();
swap(p->left, p->right);
if (p->left)qu.push(p->left);
if (p->right)qu.push(p->right);
}
}
};