DS二叉树—二叉树镜面反转

Posted szu-ds-wys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS二叉树—二叉树镜面反转相关的知识,希望对你有一定的参考价值。

题目描述

假设二叉树用二叉链表存储,用先序序列结果创建。输入二叉树的先序序列,请你先创建二叉树,并对树做个镜面反转,再输出反转后的二叉树的先序遍历、中序遍历、后序遍历和层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。

 

--程序要求--

若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio

程序中若include多过一个头文件,不看代码,作0分处理

不允许使用第三方对象或函数实现本题的要求

 

 

 

输入

测试次数t

每组测试数据是一个二叉树的先序遍历序列,#表示空树

 

输出

对每棵二叉树,输出镜面反转后的先序、中序、后序和层次遍历序列。如果空树,输出四个NULL(后面不加空格)。如下:

NULL

NULL

NULL

NULL

样例输入

3 41#32###65##7## AB#C##D## AB##C##

样例输出

4 6 7 5 1 3 2 7 6 5 4 3 2 1 7 5 6 2 3 1 4 4 6 1 7 5 3 2 A D B C D A C B D C B A A D B C A C B C A B C B A A C B

提示

#include<iostream>
using namespace std;
class BitreeNode
{
public:
    char data;
    BitreeNode *left;
    BitreeNode *right;
    BitreeNode()
    {
        left=right=NULL;
    }
};
 
class Bitree
{
public:
    int pos;
    BitreeNode *Root;
    char *strtree;
    Bitree(char *str)
    {
        pos=0;
        strtree=str;
        Root=CreateBitreeReverse();
    }
    BitreeNode *CreateBitreeReverse()
    {
        char ch=strtree[pos];
        pos++;
        if(ch==#)
            return NULL;
        else
        {
            BitreeNode *T=new BitreeNode();
            T->data=ch;
            T->right=CreateBitreeReverse();
            T->left=CreateBitreeReverse();
            return T;
        }
    }
    void preorder(BitreeNode *T)
    {
        if(T!=NULL)
        {
            cout<<T->data<<" ";
            preorder(T->left);
            preorder(T->right);
        }
        return;
    }
    void inorder(BitreeNode *T)
    {
        if(T!=NULL)
        {
            inorder(T->left);
            cout<<T->data<<" ";
            inorder(T->right);
        }
        return;
    }
    void pastorder(BitreeNode *T)
    {
        if(T!=NULL)
        {
            pastorder(T->left);
            pastorder(T->right);
            cout<<T->data<<" ";
        }
        return;
    }
    void levelorder()
    {
        BitreeNode *Q[100];
        int fr=0;
        int re=0;
        if(Root==NULL)
            return;
        Q[0]=Root;
        re++;
        while(fr!=re)
        {
            BitreeNode *temp=Q[fr];
            cout<<temp->data<<" ";
            if(temp->left!=NULL)
            {
                Q[re]=temp->left;
                re++;
            }
            if(temp->right!=NULL)
            {
                Q[re]=temp->right;
                re++;
            }
            fr++;
        }
        return;
    }
};
 
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        char str[100];
        cin>>str;
        Bitree Tree(str);
        if(Tree.Root==NULL)
        {
            cout<<"NULL"<<endl;
            cout<<"NULL"<<endl;
            cout<<"NULL"<<endl;
            cout<<"NULL"<<endl;
        }
        else
        {
            Tree.preorder(Tree.Root);
            cout<<endl;
            Tree.inorder(Tree.Root);
            cout<<endl;
            Tree.pastorder(Tree.Root);
            cout<<endl;
            Tree.levelorder();
            cout<<endl;
        }
    }
    return 0;
}

以上是关于DS二叉树—二叉树镜面反转的主要内容,如果未能解决你的问题,请参考以下文章

玩转二叉树

PTA玩转二叉树

玩转二叉树

L2-011 玩转二叉树

练一练(11)玩转二叉树

ACM题目————玩转二叉树