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;
}

  

posted @ 2013-11-21 22:38  七年之后  阅读(451)  评论(0编辑  收藏  举报