• 基础数据结构-二叉树-层次遍历


    层次遍历二叉树,是从根结点开始遍历,按层次次序“自上而下,从左至右”访问树中的各结点。

    建树方法采用“先序遍历+空树用0表示”的方法

    要求:采用队列对象实现,函数框架如下:
    输入

    第一行输入一个整数t,表示有t个测试数据

    第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行

    输出

    逐行输出每个二叉树的层次遍历结果

    样例输入

    2
    AB0C00D00
    ABCD00E000FG00H0I00
    样例输出

    ABDC
    ABFCGHDEI

    #include<iostream>
    #include<string>
    #include<queue>
    using namespace std;
    
    class BiTreeNode
    {
    public:
        char data;        //结点数据
        BiTreeNode *LeftChild;    //左子树指针
        BiTreeNode *RightChild;        //右子树指针
        BiTreeNode():LeftChild(NULL),RightChild(NULL){}
        ~BiTreeNode(){}
    };
    
    class BiTree
    {
    private:
        BiTreeNode *Root;    //根结点指针
        int pos;
        string strTree;
        BiTreeNode *CreateBiTree();
        void PreOrder(BiTreeNode *t);
        void InOrder(BiTreeNode *t);
        void PostOrder(BiTreeNode *t);
        void LevelOrder(BiTreeNode *t);
    public:
        BiTree(){};
        ~BiTree(){};
        void CreateTree(string TreeArray);
        void PreOrder();
        void InOrder();
        void PostOrder();
        int Leaves();
        void LevelOrder();
    };
    
    //构造二叉树,利用先序遍历结果建树
    void BiTree::CreateTree(string TreeArray)    //公有函数,对外接口
    {
        pos = 0;
        strTree.assign(TreeArray);
        Root = CreateBiTree();
    }
    
    BiTreeNode *BiTree::CreateBiTree()    //递归建树,私有函数,类内实现
    {
        BiTreeNode *T;
        char ch;
        ch=strTree[pos++];
        if(ch=='0')
            T = NULL;
        else
        {
            T = new BiTreeNode();
            T->data = ch;        //生成根结点
            T->LeftChild = CreateBiTree();    //构造左子树
            T->RightChild = CreateBiTree();    //构造右子树
        }
        return T;
    }
    
    //定义先序遍历函数
    void BiTree::PreOrder()    //公有函数,对外接口
    {
        PreOrder(Root);
    }
    
    void BiTree::PreOrder(BiTreeNode *t)    //私有函数,类内实现
    {
        if(t!=NULL)
        {
            cout << t->data;    //输出当前结点t的数据,表示t已经访问
            PreOrder(t->LeftChild);    //先序遍历t的左孩子
            PreOrder(t->RightChild);    //先序遍历t的右孩子
        }
    }
    
    //定义中序遍历函数
    void BiTree::InOrder()    //公有函数,对外接口
    {
        InOrder(Root);
    }
    
    void BiTree::InOrder(BiTreeNode *t)    //私有函数,类内实现
    {
        if(t)
        {
            InOrder(t->LeftChild);    //中序遍历t的左孩子
            cout << t->data;        //输出当前结点t的数据,表示t已经访问
            InOrder(t->RightChild);    //中序遍历t的右孩子
        }
    }
    
    //后序遍历函数
    void BiTree::PostOrder()    //公有函数,对外接口
    {
        PostOrder(Root);
    }
    
    void BiTree::PostOrder(BiTreeNode *t)    //私有函数,类内实现
    {
        if(t)
        {
            PostOrder(t->LeftChild);    //后序遍历t的左孩子
            PostOrder(t->RightChild);    //后序遍历t的右孩子
            cout << t->data;        //输出当前结点t的数据,表示t已经访问
        }
    }
    
    //定义层次遍历函数
    void BiTree::LevelOrder()    //公有函数,对外接口
    {    LevelOrder(Root);    }
    
    void BiTree::LevelOrder(BiTreeNode *t)
    {//用队列实现
        queue<BiTreeNode*>tq;//创建队列tq,队列的每个元素都是结点指针
        BiTreeNode* p=t;
        if(!p==NULL)
        {
            tq.push(p);
        }
        while(!tq.empty())
        {
            p = tq.front();
            cout << p->data;
            tq.pop();
            if(p->LeftChild)
            {tq.push(p->LeftChild);}
            if(p->RightChild)
            {tq.push(p->RightChild);}
        }
    }
    
    int main(void)
    {
        int t;
        BiTree T;
        cin >> t;
        string str;
        for(int i=0;i<t;i++)
        {
            cin >>str;
            T.CreateTree(str);
            T.LevelOrder();    
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    约瑟夫问题
    再谈Bellman-Ford
    Uva 11478 Halum操作
    Uva 11090 在环中
    Bellman-Ford
    Uva 10537 过路费
    Uva 10917
    LA 3713 宇航员分组
    2-SAT
    LA 3211 飞机调度
  • 原文地址:https://www.cnblogs.com/nathaneko/p/6491940.html
Copyright © 2020-2023  润新知