有的時候自己想了很久卻還是想不出來思路,一看解析卻很簡單,看來還是應該好好刷題啊!!!
(一)題目描述
(二)代碼
#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】如何建立一顆二叉樹