动态模拟创建二叉树

    题目要求
    编写一个c程序,要求在c程序图形界面下动态模拟显示二叉树的先序创建过程。

    题目分析
    为了动态地显示二叉树的先序创建过程,首先要在内存中生成一棵真正的二叉树,然后对二叉树进行先序遍历,每遍历到一个结点就将该结点的内容输出到界面上,打印出一个结点的图案。在遍历二叉树的过程中,要根据二叉树的结点所在该二叉树中的位置的不同,设置图形界面中对应结点的图案的位置。另外,还有结点之间的线。


    程序如下:

    #include"stdio.h"
    #include<conio.h>
    #include<graphics.h>
    
    typedef struct BiTNode{
       char data;
       struct BiTNode *lchild;
       struct BiTNode *rchild;
     }BiTNode,*BiTree;
    
    creatBiTree(BiTree *T)
    {
        char c;
        gotoxy(5,5);         //将光标移动到指定位置,前参为列
        printf("Please input chareter to creat a BiTree\n");
        scanf("%c",&c);
        if(c==' ')
            *T=NULL;
        else
          {     
               *T=(BiTNode *)malloc(sizeof(BiTNode));
               (*T)->data=c;
               creatBiTree(&((*T)->lchild));
               creatBiTree(&((*T)->rchild));
          }
     }
    
     printtree(BiTree T,int x,int y)
     {
             char e[2]={'\0','\0'};
             if(T)
             {    //递归结束条件,T为空
                   {//画出一个结点,程序暂停两秒
                         e[0]=T->data;
                         circle(x,y,8);
                         settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
                         outtextxy(x,y,e);
                         sleep(2);
                   }
                  if(printtree(T->lchild,x-(200-y),y+20))
                        line(x,y,x+(200-y),y+20);
                  if(printtree(T->child,x-(200-y),y+20))
                        line(x,y,x+(200-y),y+20);
                  return 1;
              }
               return 0;          
     }
    
    
    main()
    {
        BiTree T=NULL;
        int y=100,x=350;     //设置二叉树根结点坐标
        int GraphDriver=DETECT;
        int GraphMode;
        int color;
        color=RED;
        //初始化图形系统,驱动文件"\\tc\\bgi"的路径不能设置错误
        initgraph(&GraphDriver,&GraphMode,"\\tc\\bgi"); 
        setcolor(color);//设置图形颜色:红色
        creatBiTree(&T);
        printtree(T,x,y);
        getche();
        closegraph();
     }                

    算法分析:
    circle()的功能是画一个以(x,y)圆心,e为半径的圆
    settextstyle()的功能是设置输出字符的大小,字体等。
    outtextxy()的功能是在屏幕的(x,y)的坐标位置上输出结点中包含的字符
    sleep()的功能是将程序挂起两秒。
    line()作用是画出结点之间的连线(划线的条件:根结点和子树同在)
    本程序绘图规律:画出根结点->画出左子树->画出根结点与左子树间的连线->画出右子树->画出根结点与右子树连线。

    注意:本程序在 Tubro C 下才可运行,因为代码中包含了Tubro C 中的图形函数库。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值