二叉树复制和左右子树互换
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:301 测试通过:193
总提交:301 测试通过:193
描述
二叉树是非常重要的树形数据结构。复制一棵二叉树是在另一个存储区存放相同的结构和内容,而一棵二叉树上所有左右子树互换是在原存储区上的运算。
请分别根据先序遍历序列建立两棵的二叉树(用#代表空树或空子树),再将这两棵二叉树复制为左右子树建立第三棵二叉树,输出先序和层次遍历序列,最后将第三棵二叉树上所有左右子树互换,并输出先序和层次遍历序列。
输入
共三行
前两行分别对应两棵二叉树的先序遍历序列,用#代表空树或空子树
第三行为第三棵二叉树的根结点。
输出
共四行
前两行为第三棵二叉树生成时的先序、层次遍历序列,
后两行为第三棵二叉树左右子树互换后的先序、层次遍历序列。
样例输入
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
题目来源
CHENZ
分析:递归。
#include<iostream>
using namespace std;
//二叉树复制和左右子树互换
class BTNode
{
public:
char data;
BTNode *lChild;
BTNode *rChild;
BTNode(char c)
{
data = c;
}
};
void Create(BTNode *&t)
{
char c;
cin>>c;
if(c == '#')
t = NULL;
else
{
t = new BTNode(c);
t->lChild = NULL;
t->rChild = NULL;
Create(t->lChild);
Create(t->rChild);
}
}
//交换左右子树
void Swap(BTNode *&t)
{
if(t)
{
if(t->lChild != NULL || t->rChild != NULL)
{
BTNode *tmp = t->lChild;
t->lChild = t->rChild;
t->rChild = tmp;
}
Swap(t->lChild);
Swap(t->rChild);
}
}
//先序遍历
void PreOrder(BTNode *&t)
{
if(t)
{
cout<<" "<<t->data;
PreOrder(t->lChild);
PreOrder(t->rChild);
}
}
//层次遍历
void LevelOrder(BTNode *&t)
{
int front = 0, rear = 1;
BTNode *p[100];
p[0] = t;
while(front < rear)
{
if(p[front])
{
cout<<" "<<p[front]->data;
p[rear++] = p[front]->lChild;
p[rear++] = p[front]->rChild;
front ++;
}
else
front ++;
}
}
int main()
{
BTNode *p1, *p2;
char c;
Create(p1); Create(p2);
cin>>c;
BTNode *t = new BTNode(c);
t->lChild = p1; t->rChild = p2;
cout<<"PreOrder:";
PreOrder(t);
cout<<endl;
cout<<"LevelOrder:";
LevelOrder(t);
cout<<endl;
Swap(t);
cout<<"PreOrder:";
PreOrder(t);
cout<<endl;
cout<<"LevelOrder:";
LevelOrder(t);
cout<<endl;
return 0;
}