紫书章六例题七 树的层次遍历 UVA 122(链表)

开始看错了题目以为是一颗满二叉树,然后就很开心地开了一个数组。。最后RE。因为 题目中说的节点数是256,不一定是满的,如果全是左孩子,这个时候数组就大的不得了啦。然后可以用链表的方法
用数组模拟链表

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <sstream>
#include <queue>
using namespace std;
struct node
{
    int v;
    int l,r;
};
node tree[300];
int sum=1;
struct node1
{
    int v,xb;
};
void judge(int i)
{
    if(tree[i].l) {sum++;judge(tree[i].l);}
    if(tree[i].r) {sum++;judge(tree[i].r);}
}
void level()
{
    queue <node1> q;
    q.push((node1){tree[1].v,1});
    int gg=0;
    while(!q.empty())
    {
        node1 t=q.front();
        q.pop();
        if(gg) printf(" ");
        printf("%d",t.v);
        gg=1;
        if(tree[t.xb].l) q.push((node1){tree[tree[t.xb].l].v,tree[t.xb].l});
        if(tree[t.xb].r) q.push((node1){tree[tree[t.xb].r].v,tree[t.xb].r});
    }
}
int main()
{
    //freopen("E:\\input.txt","r",stdin);
    string str;
    memset(tree,0,sizeof(tree));
    int flag=0,now=1,num=0;
    while(cin>>str)
    {
        if(str=="()")
        {
            if(flag||!tree[1].v) printf("not complete\n");
            else{
                judge(1);
                if( sum == num ) { level();printf("\n");}
                else printf("not complete\n");
            }
            num=0;sum=1;
            memset(tree,0,sizeof(tree));
            now=1,flag=0;
        }
        else{
            num++;
            int cur=1;
            int k=str.find(',');
            string a1=str.substr(1,k-1);
            int len=str.length()-k-2;
            string a2=str.substr(k+1,len);
            stringstream ss(a1);
            int v;
            ss>>v;
            int temp=1;
            if(len==0) {if(!tree[1].v) tree[1].v=v;else flag=1;}
            else{
                for(int i=0;i<len;i++)
                {
                    if(a2[i]=='L')
                    {
                        if(tree[temp].l)
                              temp=tree[temp].l;
                        else {
                            tree[temp].l=++now;
                            temp=tree[temp].l;
                        }
                    }
                    else if(a2[i]=='R')
                    {
                        if(tree[temp].r)
                            temp=tree[temp].r;
                        else {
                            tree[temp].r=++now;
                            temp=tree[temp].r;
                        }
                    }
                }
                if(tree[temp].v) flag=1;
                else tree[temp].v=v;
            }
        }
    }
    return 0;
}

然后用指针来写链表

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <sstream>
#include <queue>
using namespace std;
struct node
{
    int v;
    node *l,*r;
    node(int a=0,node *left=NULL,node *right=NULL)
    {
        v=a,l=left,r=right;
    }
};
node *root;
int sum=1;
void judge(node *t)
{
    if(t->l) {sum++;judge(t->l);}
    if(t->r) {sum++;judge(t->r);}
}
void level()
{
    queue <node*> q;//注意这里的类型 node*
    q.push(root);
    int gg=0;
    while(!q.empty())
    {
        node *t=q.front();
        q.pop();
        if(gg) printf(" ");
        printf("%d",t->v);
        gg=1;
        if(t->l!=NULL) q.push(t->l);
        if(t->r!=NULL) q.push(t->r);
    }
}
void remove_tree(node *u)
{
    if(u == NULL ) return ;
    remove_tree(u->l);
    remove_tree(u->r);
    delete u;//new 用 delete,malloc 用free
}
int main()//注意要清空
{
    //freopen("E:\\input.txt","r",stdin);
    string str;
    int flag=0,now=1,num=0;
    root=new node();
    while(cin>>str)
    {
        if(str=="()")
        {
            if(flag||!root->v) printf("not complete\n");
            else{
                judge(root);
                if( sum == num ) { level();printf("\n");}
                else printf("not complete\n");
            }
            remove_tree(root);
            root=new node();
            num=0;sum=1,flag=0;
        }
        else{
            num++;
            int cur=1;
            int k=str.find(',');
            string a1=str.substr(1,k-1);
            int len=str.length()-k-2;
            string a2=str.substr(k+1,len);
            stringstream ss(a1);
            int v;
            ss>>v;
            node *temp=root;
            if(len==0) {if(!root->v) root->v=v;else flag=1;}
            else{
                for(int i=0;i<len;i++)
                {
                    if(a2[i]=='L')
                    {
                        if(temp->l!=NULL)
                              temp=temp->l;
                        else {
                            temp->l=new node();
                            temp=temp->l;
                        }
                    }
                    else if(a2[i]=='R')
                    {
                        if(temp->r!=NULL)
                            temp=temp->r;
                        else {
                            temp->r=new node();
                            temp=temp->r;
                        }
                    }
                }
                if(temp->v) flag=1;
                else temp->v=v;
            }
        }
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值