设有一棵二叉树,其节点值为字符型并假设各值互不相等,采用二叉链表存储表示。现输入其扩展二叉树的前序遍历序列,要求编写一个算法交换二叉树中所有节点的左右子树,并输出交换后的前序遍历。
Input
输入的第一行为一个整数n,表示接下来有n组数据。
接下来n组,每组占一行,每行包含一个扩展二叉树的前序遍历
Output
对于每组数据,若二叉树不为空,输出交换完左右子树后的前序遍历,每组输出占一行;否则,不输出任何信息。
Sample Input
2 AB#D##C## ABD##E##C#F##
Sample Output
ACBD ACFBED
#include<iostream>
#include<stdio.h>
using namespace std;
struct BiNode{
char data;
BiNode *l,*r;
BiNode(){
l=r=NULL;
}
};
class Tree{
public:
Tree(){
root=Creat();
}
void Delete(char x,int flag){
Delete(x,flag,root);
}
void PreOder(){
if(root){
PreOder(root);
cout<<endl;
}
}
void exchange(){
exchange(root);
}
~Tree(){
Release(root);
}
private:
BiNode *root;
BiNode* Creat(){
BiNode *bt;
char ch;
cin>>ch;
if(ch=='#'){
bt=NULL;
}else{
bt=new BiNode;
bt->data=ch;
bt->l=Creat();
bt->r=Creat();
}
return bt;
}
void exchange(BiNode* &bt){
if(bt){
exchange(bt->l);
exchange(bt->r);
BiNode* temp=bt->l;
bt->l=bt->r;
bt->r=temp;
}
}
void Release(BiNode *bt){
if(bt){
Release(bt->l);
Release(bt->r);
delete bt;
}
}
int Delete(char x,int flag,BiNode*& bt){
if(bt==NULL){
return 0;
}
if(bt->data==x){
flag=1;
}
int left=Delete(x,flag,bt->l);
int right=Delete(x,flag,bt->r);
if(flag==1){
if(bt->data==x){
return 1;
}
delete bt;
}else{
if(left==1){
bt->l=NULL;
}
if(right==1){
bt->r=NULL;
}
}
return 0;
}
void PreOder(BiNode *bt){
if(bt){
cout<<bt->data;
PreOder(bt->l);
PreOder(bt->r);
}
}
};
int main()
{
int n;
while(cin>>n){
while(n--){
Tree t;
t.exchange();
t.PreOder();
}
}
return 0;
}