zoukankan      html  css  js  c++  java
  • 数据结构大实习——二叉树与数

    #include <iostream>
    #include <cstring>
    #include <string>
    #include <cstdlib>
    #include <queue>
    #include <cstdio>
    #include <stack>
    
    using namespace std;
    
    typedef struct node
    {
        char data[100];
        node *lt,*rt;
        bool ltag,rtag;
    } tree;
    
    bool flag,root;
    char in[100];
    
    void TreeNodeSet(tree *&t)//初始化指针
    {
        t=(tree*)malloc(sizeof(tree));
        t->lt=NULL;
        t->rt=NULL;
        t->ltag=true;
        t->rtag=true;
        return ;
    }
    
    void DfsTagSet(tree *&t)//初始化节点标记
    {
        if(t==NULL)return ;
        t->ltag=true;
        t->rtag=true;
        DfsTagSet(t->lt);
        DfsTagSet(t->rt);
        return ;
    }
    
    void ClearQue(queue<tree**> &q)//清空队列
    {
        while(!q.empty())
        {
            q.pop();
        }
        return ;
    }
    
    void CreatBsTree(tree *&t)//按层次建立二叉树
    {
        queue<tree**> q;
        int n;
        cout<<"tree's level:";
        cin>>n;
        TreeNodeSet(t);
        q.push(&t);
        for(int lev=0; lev<n; lev++)
        {
            int len=q.size();
            for(int i=0; i<len; i++)
            {
                tree **tmp=q.front();
                q.pop();
                cout<<"level "<<lev+1<<" no "<<i+1<<":";
                scanf("%s",in);
                if(strcmp(in,"NULL")==0)
                {
                    free(*tmp);
                    (*tmp)=NULL;
                }
                else
                {
                    strcpy((*tmp)->data,in);
                    if(lev!=n-1)
                    {
                        TreeNodeSet((*tmp)->lt);
                        q.push(&((*tmp)->lt));
                        TreeNodeSet((*tmp)->rt);
                        q.push(&((*tmp)->rt));
                    }
                }
            }
        }
        ClearQue(q);
    }
    
    void PreOrderDfs(tree *&t)//递归先序遍历
    {
        if(t==NULL)return ;
        flag?cout<<t->data:cout<<" "<<t->data;
        flag=false;
        PreOrderDfs(t->lt);
        PreOrderDfs(t->rt);
        return ;
    }
    
    void MidOrderDfs(tree *&t)//递归中序遍历
    {
        if(t==NULL)return ;
        MidOrderDfs(t->lt);
        flag?cout<<t->data:cout<<" "<<t->data;
        flag=false;
        MidOrderDfs(t->rt);
        return ;
    }
    
    void LastOrderDfs(tree *&t)//递归后序遍历
    {
        if(t==NULL)return ;
        LastOrderDfs(t->lt);
        LastOrderDfs(t->rt);
        flag?cout<<t->data:cout<<" "<<t->data;
        flag=false;
        return ;
    }
    
    void PreOrderStack(tree *&t)//非递归先序遍历
    {
        stack<tree*> s;
        s.push(t);
        while(!s.empty())
        {
            tree *tmp=s.top();
            s.pop();
            flag?cout<<tmp->data:cout<<" "<<tmp->data;
            flag=false;
            if(tmp->rt!=NULL)
                s.push(tmp->rt);
            if(tmp->lt!=NULL)
                s.push(tmp->lt);
        }
        return ;
    }
    
    void MidOrderStack(tree *&t)//非递归中序遍历
    {
        stack<tree *> s;
        s.push(t);
        while(!s.empty())
        {
            tree *tmp=s.top();
            if(tmp->ltag&&tmp->lt!=NULL)
                s.push(tmp->lt),tmp->ltag=false;
            else
            {
                s.pop();
                flag?cout<<tmp->data:cout<<" "<<tmp->data;
                flag=false;
                if(tmp->rtag&&tmp->rt!=NULL)
                    s.push(tmp->rt),tmp->rtag=false;
            }
        }
        return ;
    }
    
    void LastOrderStack(tree *&t)//非递归后序遍历
    {
        DfsTagSet(t);
        stack<tree*> s;
        s.push(t);
        while(!s.empty())
        {
            tree *tmp=s.top();
            if((!tmp->ltag)&&(!tmp->rtag))
            {
                flag?cout<<tmp->data:cout<<" "<<tmp->data;
                flag=false;
                s.pop();
            }
            if(tmp->rtag&&tmp->rt!=NULL)
                s.push(tmp->rt);
            tmp->rtag=false;
            if(tmp->ltag&&tmp->lt!=NULL)
                s.push(tmp->lt);
            tmp->ltag=false;
        }
        return ;
    }
    
    void BsTree(tree *&t)//二叉树建立以及输出
    {
        CreatBsTree(t);
        cout<<"DFS:"<<endl;
        cout<<"The PreOrderDfsTraversal:"<<endl<<"{ ";
        flag=true;
        PreOrderDfs(t);
        cout<<" }"<<endl;
        cout<<"The MidOrderDfsTraversal:"<<endl<<"{ ";
        flag=true;
        MidOrderDfs(t);
        cout<<" }"<<endl;
        cout<<"The LastOrderDfsTraversal:"<<endl<<"{ ";
        flag=true;
        LastOrderDfs(t);
        cout<<" }"<<endl;
        cout<<"STACK:"<<endl;
        cout<<"The PreOrderStackTraversal:"<<endl<<"{ ";
        flag=true;
        PreOrderStack(t);
        cout<<" }"<<endl;
        cout<<"The MidOrderStackTraversal:"<<endl<<"{ ";
        flag=true;
        MidOrderStack(t);
        cout<<" }"<<endl;
        cout<<"The LastOrderStackTraversal:"<<endl<<"{ ";
        flag=true;
        LastOrderStack(t);
        cout<<" }"<<endl;
        return ;
    }
    
    void CreatTree(tree *pre,tree *&t)//兄弟表示法建造树
    {
        in[0]='n';
        TreeNodeSet(t);
        if(pre==NULL)
            cout<<"The tree's root:"<<endl,root=false;
        else
            cout<<"Father's Node:"<<pre->data<<endl;
        cout<<"Node's Data:";
        scanf("%s",t->data);
        if(pre!=NULL)
        {
            cout<<"Current Node:"<<t->data<<endl;
            cout<<"Have brother?[No or Yes]";
            scanf("%s",in);
        }
        if(in[0]=='y'||in[0]=='Y')
        {
            cout<<endl;
            CreatTree(t,t->rt);
        }
        cout<<"Current Node:"<<t->data<<endl;
        cout<<"Have child?[No or Yes]";
        scanf("%s",in);
        if(in[0]=='y'||in[0]=='Y')
        {
            cout<<endl;
            CreatTree(t,t->lt);
        }
        cout<<endl;
        return ;
    }
    
    void Tree_PreOrderDfs(tree *&t)//先序遍历普通树
    {
        if(t==NULL)return ;
        flag?cout<<t->data:cout<<" "<<t->data;
        flag=false;
        Tree_PreOrderDfs(t->lt);
        Tree_PreOrderDfs(t->rt);
        return ;
    }
    
    void Tree_LastOrderDfs(tree *&t)//后序遍历普通树
    {
        if(t==NULL)return ;
        Tree_LastOrderDfs(t->lt);
        flag?cout<<t->data:cout<<" "<<t->data;
        flag=false;
        Tree_LastOrderDfs(t->rt);
        return ;
    }
    
    void Tree(tree *&t)
    {
        CreatTree(NULL,t);
        cout<<"
    ";
        flag=true;
        cout<<"Tree's PreOrderIntraversal:";
        Tree_PreOrderDfs(t);
        cout<<endl;
        flag=true;
        cout<<"Tree's LastOrderIntraversal:";
        Tree_LastOrderDfs(t);
        cout<<endl;
        return ;
    }
    
    int main()
    {
        string type;
        while(cout<<"tree's type[bstree or tree]:"&&cin>>type)
        {
            tree *bst,*t;
            switch(type[0])
            {
                case 'b':case 'B':
                {
                    BsTree(bst);
                    break;
                }
                case 't':case 'T':
                {
                    Tree(t);
                    break;
                }
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    python等缩进语言的词法分析实现
    收集Android程序测试代码覆盖率
    对语言之争的看法
    关于asmlinkage
    洛谷 P4171 [JSOI2010] 满汉全席(2sat)
    Codeforces Round #748 (Div. 3)解题报告
    洛谷 P1712 [NOI2016] 区间(尺取法、线段树)
    洛谷 P4782 【模板】2SAT 问题
    洛谷 P3513 [POI2011]KONConspiracy(2sat方案数)
    梦见和深爱的女孩牵着手,竟然从梦中幸福惊醒,醒后一片悲伤~~
  • 原文地址:https://www.cnblogs.com/wyhbadly/p/10138580.html
Copyright © 2011-2022 走看看