• 树的创建与遍历


    #include<iostream>
    #include<list>
    #include<fstream>
    #include<queue>
    using namespace std;

    template<class T>
    class Tree //树的建立
    {
    T *NA;
    list<int> *HL;
    int root;
    int sizeN,sizeC;
    int maxN;
    public:
    Tree(int n=100):root(-1),sizeN(0),sizeC(0),maxN(n)
    {
    NA=new T[n];
    HL=new list<int>[n];
    }
    ~Tree(){delete []NA; delete []HL;}
    int Empty()const{return size==0;}
    int Full()const{return sizeN==maxN;}
    int SizeN()const{return sizeN;}
    int SizeC()const{return sizeC;}
    int FindNode(const T& v)const;
    bool FindNode(T& v,int pos)const;
    bool InsertN(const T& node);
    bool InsertC(const T& parent,const T& child);
    void ReadTree(const char* filename);
    void WriteTree(const char* filename);
    friend ostream& operator<<(ostream& ostr,const Tree<T>& t)
    {
    for(int i=0;i<t.sizeN;i++)
    {
    ostr<<i<<'-'<<t.NA[i]<<':';
    list<int>::iterator first=t.HL[i].begin(),last=t.HL[i].end();
    //cout<<*first<<endl;
    //cout<<*last<<endl;
    for(;first!=last;++first)
    {
    ostr<<'('<<*first<<')'<<' ';
    }
    ostr<<endl;
    }
    return ostr;
    }
    friend istream& operator>>(istream& istr,Tree<T>& t)
    {
    char str[50];
    int n,i;
    T parent,child;
    istr>>str>>n;
    istr>>str>>parent;
    t.InsertN(parent);
    t.root=t.sizeN-1;
    istr>>str;
    for(i=1;i<=n-1;++i)
    {
    istr>>child;
    t.InsertN(child);
    }
    istr>>str>>n;
    for(i=1;i<=n;++i)
    {
    istr>>parent>>child;
    t.InsertC(parent,child);
    }
    return istr;
    }
    void BFS();
    void DFS(int r);
    };

    template <class T>
    int Tree<T>::FindNode(const T& node)const //找到node结点并返回其下标
    {
    for(int i=0;i<sizeN;i++)
    {
    if(NA[i]==node)
    return i;
    }
    return -1;
    }

    template<class T>
    bool Tree<T>::FindNode(T& node,int pos)const //将pos处的结点赋值给node
    {
    if(pos<0||pos>=sizeN)
    {
    return 0;
    }
    node=NA[pos];
    return 1;
    }

    template<class T> //插入结点
    bool Tree<T>::InsertN(const T& node)
    {
    if(sizeN==maxN)
    {
    return 0;
    }
    NA[sizeN]=node;
    sizeN++;
    return 1;
    }

    template <class T> //插入子节点
    bool Tree<T>::InsertC(const T& parent,const T& child)
    {
    int pi=FindNode(parent),cj=FindNode(child);
    //cout<<pi<<' '<<cj<<endl;
    if(pi==-1||cj==-1||pi==cj)
    {
    return 0;
    }
    HL[pi].insert(HL[pi].end(),cj);
    sizeC++;
    return 1;
    }

    template <class T>
    void Tree<T>::BFS() //BFS
    {
    queue<int> q;
    q.push(root);
    while(!q.empty())
    {
    int temp=q.front();
    q.pop();
    cout<<NA[temp]<<' ';
    for(list<int>::iterator it=HL[temp].begin();it!=HL[temp].end();it++)
    {
    q.push(*it);
    }
    }
    }

    template <class T>
    void Tree<T>::DFS(int r) //DFS
    {
    cout<<NA[r]<<' ';
    for(list<int>::iterator it=HL[r].begin();it!=HL[r].end();it++)
    {
    DFS(*it);
    }
    }

    int main()
    {
    /*
    Tree<char> T(20);
    cin>>T;
    cout<<T;*/
    Tree<char> T(20);
    ifstream fin;
    fin.open("treein.txt",ios::in);
    if(!fin)
    {
    cout<<"cannot open this file ";
    exit(1);
    }
    fin>>T;
    cout<<T;
    cout<<"BFS遍历序列:"<<endl;
    T.BFS();
    cout<<endl;
    cout<<"DFS遍历序列:"<<endl;
    T.DFS(0);
    return 0;
    }

    本篇文章中的输入采用的是C++的文件输入格式为

    <Node> 13

    <Root> A

    <Others>

    B C D E F G H I J K L M

    <Childs> 12

    A B

    A C

    A D

    B E

    B F

    C G

    D H

    D I

    D J

    G K

    G L

    J M

    其中 第一行是结点数,第二行是根节点,第三,四行是其余的结点,第五行是其余结点的数量,后12行的前一个字符是父节点,后一个字符是父节点的子节点

    因为在本篇文章中重载了Tree的>>和<<因此也可以直接采用cin>>T 和cout<<T的输入输出方式。

  • 相关阅读:
    Mbps、Kbps、bps、kb、mb区别和换算
    Python导入模块方法
    C# WinForm 程序免安装 .NET Framework(XP/win7/win10环境运行)
    生成缩略图
    WCF 的优势和特点
    不要在using语句中调用WCF服务
    pb getchild获取DropDownDW子窗体后进行取值
    Bootstrap后台管理模板调研
    PB调用C#编写的DLL
    PowerBuilder与嵌入浏览器交互
  • 原文地址:https://www.cnblogs.com/Numblzw/p/9932745.html
Copyright © 2020-2023  润新知