题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
#include <iostream>
#include <stack>
using namespace std;
struct node{
node *lchild,*rchild;
int value;
};
class list{
public:
list();
void InOrder();
void turnover();
private:
void turnover0(node* p);
private:
node* root;
};
void list::turnover0(node* p)
{
if(NULL==p)
return;
node* temp=p->lchild;
p->lchild=p->rchild;
p->rchild=temp;
turnover0(p->lchild);
turnover0(p->rchild);
}
void list::turnover()
{
turnover0(root);
}
void list::InOrder()
{
if(NULL==root)
return;
stack<node*> s;
node* curr=root;
while(1){
while(curr){
s.push(curr);
curr=curr->lchild;
}
if(s.empty())
break;
curr=s.top();
s.pop();
cout<<curr->value<<'\t';
curr=curr->rchild;
}
}
list::list()
{
cout<<"请输入您想要输入的数字,按‘#’结束:"<<endl;
int i;
if(cin>>i==NULL){
cout<<"您的输入有误"<<endl;
exit(-1);
}
root=new node;
root->value=i;
root->lchild=NULL;
root->rchild=NULL;
node *p,*q;
while(cin>>i){
p=new node;
p->value=i;
p->lchild=NULL;
p->rchild=NULL;
q=root;
while(1){
if(p->value<q->value){
if(q->lchild==NULL){
q->lchild=p;
break;
}
q=q->lchild;
}
else if(p->value>q->value){
if(q->rchild==NULL){
q->rchild=p;
break;
}
q=q->rchild;
}
}
}
}
void main()
{
list test;
test.InOrder();
cout<<endl;
test.turnover();
test.InOrder();
system("pause");
}