1021-二叉树复制和左右子树互换
描述
二叉树是非常重要的树形数据结构。复制一棵二叉树是在另一个存储区存放相同的结构和内容,而一棵二叉树上所有左右子树互换是在原存储区上的运算。
请分别根据先序遍历序列建立两棵的二叉树(用#代表空树或空子树),再将这两棵二叉树复制为左右子树建立第三棵二叉树,输出先序和层次遍历序列,最后将第三棵二叉树上所有左右子树互换,并输出先序和层次遍历序列。
输入
共三行
前两行分别对应两棵二叉树的先序遍历序列,用#代表空树或空子树
第三行为第三棵二叉树的根结点。
输出
共四行
前两行为第三棵二叉树生成时的先序、层次遍历序列,
后两行为第三棵二叉树左右子树互换后的先序、层次遍历序列。
样例输入
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; }