zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    最近一周的日期选择设置
    使用两个 Windows 窗体 DataGridView 控件创建一个主/从窗体
    WCF使用小例子
    SQL Server中JOIN的用法
    C#设计模式(13)——代理模式(Proxy Pattern)
    SQL四种语言:DDL,DML,DCL,TCL
    Log4Net组件的应用详解
    JSP九大内置对象详解
    Objective-C:自定义Block函数
    C语言:指针的几种形式二
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3436537.html
Copyright © 2011-2022 走看看