数据结构5

呃 。。。心情不好。。。


实验五


建立一个含有10个节点的二叉树,并以直观的形式输出该二叉树,同时要求对该树进行层次遍历,输出该树的深度。   


建树神马的,想想暑假用的线段树,凑合凑合吧,不过还是自己用递归重新写了写。。。

这个实验最恶心的地方是以直观的形式输出二叉树。。。蛋疼了。。。



//由于编辑框显示一排最多只有80个字符
//若是用二叉树的形式表示,以2^n记
//要正常显示的话,可以建深度为5的二叉树
//因为要保证第一个接近中间<=40即为2^5<40
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define max(a,b) (a>b?a:b)
using namespace std;

typedef struct node
{
    char data;
    struct node  *l,*r;
}*Bitree;

Bitree build()
{
    char ch;
    scanf("%c",&ch);
    getchar();
    if(ch=='#')
        return NULL;
    Bitree tree=new node;
    tree->data=ch;
    tree->l=build();
    tree->r=build();
    return tree;
}

void preorder(Bitree tree)
{
    if(tree)
    {
        printf("%c ",tree->data);
        preorder(tree->l);
        preorder(tree->r);
    }
}

void inorder(Bitree tree)
{
    if(tree)
    {
        inorder(tree->l);
        printf("%c ",tree->data);
        inorder(tree->r);
    }
}

void postorder(Bitree tree)
{
    if(tree)
    {
        postorder(tree->l);
        postorder(tree->r);
        printf("%c ",tree->data);
    }
}

int Treedepth(Bitree tree)
{
    int num=0;
    if(tree)
        num=max(Treedepth(tree->l),Treedepth(tree->r))+1;
    return num;
}

char tag[100][100];
int miao;
int wu=0;
int deep;
void cengci(Bitree tree,int miao,int wu,int q)
{
    if(tree)
    {
        if(q==0)
        {
            miao=pow(2.0,deep);
            tag[++wu][miao]=tree->data;
            int ww=wu,uu=wu,mm=miao,nn=miao;
            deep--;
            cengci(tree->l,mm,ww,-1);
            deep++;
            cengci(tree->r,nn,uu,1);
        }
        else if(q==-1)
        {
            miao-=pow(2.0,deep);
            tag[++wu][miao]=tree->data;
            int ww=wu,uu=wu,mm=miao,nn=miao;
            deep--;
            cengci(tree->l,mm,ww,-1);
            cengci(tree->r,nn,uu,1);
            deep++;
        }
        else if(q==1)
        {
            miao+=pow(2.0,deep)+1;
            tag[++wu][miao]=tree->data;
            int ww=wu,uu=wu,mm=miao,nn=miao;
            deep--;
            cengci(tree->l,mm,ww,-1);
            cengci(tree->r,nn,uu,1);
        }
    }
}
int main()
{
    memset(tag,0,sizeof(tag));
    Bitree tree=build();
    deep=Treedepth(tree);
    printf("\nDepth: %d\n",deep);
    printf("\n先序遍历:\n");
    preorder(tree);
    printf("\n中序遍历:\n");
    inorder(tree);
    printf("\n后序遍历:\n");
    postorder(tree);
    printf("\n层次遍历:\n");
    cengci(tree,miao,wu,0);
    for(int i=0;i<=10;i++)
    {for(int j=0;j<=64;j++)
    {
        if(tag[i][j])
            printf("%c",tag[i][j]);
        else
            printf(" ");
    }
    printf("\n");
    }
    return 0;
}


先试试了几个样例发现暂时没问题。。。。




看上去还凑合吧,但是我试了一个满二叉树,结果发现间距什么的问题都出来了,估计是递归里面的deep没有控制好 ,懒得改了,桑心了。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值