有的时候自己想了很久却还是想不出来思路,一看解析却很简单,看来还是应该好好刷题啊!!!
(一)题目描述
(二)代码
#include <iostream>
#include<stack>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
//镜像实现
void Mirror(TreeNode *pRoot) {
if(pRoot==NULL) return;//若为空则返回
queue<TreeNode*> q; //定义一个队列
TreeNode* p=NULL;
q.push(pRoot);//将根结点加入队列
while(q.size()){//队列不为空时
p=q.front();//获得队首元素
q.pop();//出队
swap(p->left,p->right);//交换左右孩子结点,注意 此时左右结点的值已经变了,
if(p->left) q.push(p->left);//入队的时候先入的是原来右孩子结点
if(p->right) q.push(p->right);
}
}
typedef struct { //树根
TreeNode *root;
} Tree;
void insert(Tree* tree, int value)//创建树
{
TreeNode *node=new TreeNode(value);//新建一个结点
node->left = NULL;//将这个结点左右子树置为NULL
node->right = NULL;
if (tree->root == NULL)//判断树是不是空树
{
//若该树为空树,则将该结点置为根结点
tree->root = node;
}
else {//不是空树
TreeNode *temp = tree->root;//从树根开始
while (temp != NULL)//当为null时结束
{
if (value < temp->val)//小于就进左儿子
{
if (temp->left == NULL)
{
temp->left = node;
return;
}
else {//继续判断
temp = temp->left;
}
}
else {//否则进右儿子
if (temp->right == NULL)
{
temp->right = node;
return;
}
else {//继续判断
temp = temp->right;
}
}
}
}
return;
}
void inorder(TreeNode* node)//树的中序遍历
{
if (node != NULL)
{
inorder(node->left);
printf("%d ",node->val);
inorder(node->right);
}
}
void preorder(TreeNode* node)//树的中序遍历
{
if (node != NULL)
{
printf("%d ",node->val);
preorder(node->left);
preorder(node->right);
}
}
int main()
{
Tree tree;
tree.root = NULL;//创建一个空树
int n;
scanf("%d",&n);
for (int i = 0; i < n; i++)//输入n个数并创建这个树
{
int temp;
scanf("%d",&temp);
insert(&tree, temp);
}
preorder(tree.root);//中序遍历
cout<<endl;
Mirror(tree.root);
cout<<"after:"<<endl;
preorder(tree.root);//中序遍历
getchar();
return 0;
}
(三)参考文献
【1】如何建立一颗二叉树