描述
二叉树是非常重要的树形数据结构。复制一棵二叉树是在另一个存储区存放相同的结构和内容,而一棵二叉树上所有左右子树互换是在原存储区上的运算。
请分别根据先序遍历序列建立两棵的二叉树(用#代表空树或空子树),再将这两棵二叉树复制为左右子树建立第三棵二叉树,输出先序和层次遍历序列,最后将第三棵二叉树上所有左右子树互换,并输出先序和层次遍历序列。
输入
共三行
前两行分别对应两棵二叉树的先序遍历序列,用#代表空树或空子树
第三行为第三棵二叉树的根结点。
输出
共四行
前两行为第三棵二叉树生成时的先序、层次遍历序列,
后两行为第三棵二叉树左右子树互换后的先序、层次遍历序列。
样例输入
B # D # #
C E # # F # #
A
样例输出
PreOrder: A B D C E F
LevelOrder: A B C D E F
PreOrder: A C F E B D
LevelOrder: A C B F E D
#include <iostream>
#include <list>
using namespace std;
class BTNode
{
public:
char data;
BTNode *lChild;
BTNode *rChild;
};
class BTNode *Creat(BTNode *&t)
{
char c;
cin>>c;
if(c=='#')
t=NULL;
else
{
t=new BTNode;
t->data=c;
t->lChild=NULL;
t->rChild=NULL;
Creat(t->lChild);
Creat(t->rChild);
}
return t;
}
void PreOrder(BTNode *&t)
{
if(t)
{
cout<<" "<<t->data;
PreOrder(t->lChild);
PreOrder(t->rChild);
}
}
void LevelOrder(BTNode *&t)
{
list<BTNode*> Q;
if(t==NULL) return;
else
{
Q.push_back(t);
while(Q.size()>0)
{
BTNode* p=Q.front();
cout<<" "<<p->data;
if(p->lChild) Q.push_back(p->lChild);
if(p->rChild) Q.push_back(p->rChild);
Q.pop_front();
}
}
}
void Swap(BTNode *&t)
{
if(t)
{
if(t->lChild!=NULL||t->rChild!=NULL)
{
BTNode *p;
p=t->lChild;
t->lChild=t->rChild;
t->rChild=p;
}
Swap(t->lChild);
Swap(t->rChild);
}
}
int main()
{
BTNode *t,*s[3];
char ch;
s[1]=Creat(t);
s[2]=Creat(t);
cin>>ch;
s[3]=new class BTNode;
s[3]->data=ch;
s[3]->lChild=s[1];
s[3]->rChild=s[2];
cout<<"PreOrder:";
PreOrder(s[3]);
cout<<endl;
cout<<"LevelOrder:";
LevelOrder(s[3]);
cout<<endl;
Swap(s[3]);
cout<<"PreOrder:";
PreOrder(s[3]);
cout<<endl;
cout<<"LevelOrder:";
LevelOrder(s[3]);
cout<<endl;
return 0;
}