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