Programing.BlogSky.com
X
تبلیغات
رایتل

این برنامه یک درخت دودویی را رسم نموده و ان را پیمایش می کند

#include<conio.h>
#include<stdio.h>
#include <alloc.h>
#include <graphics.h>
#include<dos.h>
#include <stdlib.h>
struct tree{
      int data;
      struct tree *left;
      struct tree *right;
     };
 struct tree *start=NULL,*ptr=NULL,*newp=NULL;
 int a1,a2,i;
 char help[10];
 void tahaye(void);
 int addnode(struct tree *test);
 int sum1(struct tree *tes);
 int showtree(struct tree *test1,int x,int y,int xy);
 int order(struct tree *test2,int,int,int,int);
//*************************  main program  **********************************
void main()
{
  tahaye();
  textbackground(1);
  clrscr();
  printf("Enter node number from tree<1 to 20>:");
  scanf("%d",&a1);
  if((a1>20)||(a1<1))
  {
  printf("the number out rang......press any key for quit...");
  getch();

  }
  for(i=1;i<=a1;i++)
  {
  printf("Enter number[%d]:",i);
  scanf("%d",&a2);
  if(i==1)
  {
   start=(tree *)malloc(sizeof(tree));
   start->data=a2;
   start->left=NULL;
   start->right=NULL;
  }
  else
  {
   ptr=start;
   addnode(start);
  }
  }

 int x1=DETECT,y1;
 initgraph(&x1,&y1,"c:\\tc\\bgi");
 setbkcolor(15);
 showtree(start,2,1,1);
 outtextxy(30,430,"press any key for inorder");
 getch();
 outtextxy(30,30,"inorder");
 order(start,2,1,1,1);
 bar(20,420,300,440);
 outtextxy(30,430,"press any key for preorder");
 getch();
 bar(20,20,100,40);
 outtextxy(30,30,"preorder");
 order(start,2,1,1,2);
 bar(20,420,300,440);
 outtextxy(30,430,"press any key for postorder");
 getch();
 bar(20,20,100,40);
 outtextxy(30,30,"postorder");
 order(start,2,1,1,3);
 bar(20,420,300,440);
 setcolor(1);
 outtextxy(30,430,"press any key for quit...");
 getch();
 closegraph();
}
//***************************** tahaye  subprogram ***************************
void tahaye()
{
 int x1=DETECT,y1;
 initgraph(&x1,&y1,"c:\\tc\\bgi");
 setbkcolor(1);
 setcolor(15);
 outtextxy(30,30,"help:");
 outtextxy(30,50,"    1)Max node=20   &   Min node=1");
 outtextxy(30,70,"    2)read=inorder,preorder,postorder");
 outtextxy(30,430,"press any key for start...");
 getch();
 closegraph();
}
//***************************** addnode subprogram **************************
int addnode(struct tree *test)
{
 if((test->left==NULL)||(test->right==NULL))
 {
  newp=(tree *)malloc(sizeof(tree));
  newp->data=a2;
  newp->left=NULL;
  newp->right=NULL;
  if(test->left==NULL)
   test->left=newp;
  else
   test->right=newp;
        newp=NULL;
        return(0);
 }
 if(sum1(test->right)+1<sum1(test->left))
  addnode(test->right);
 else
  addnode(test->left);
 return 0;
}
//**************************** sum1 subprogram ******************************
int sum1(struct tree *tes)
{
 if (tes==NULL)
  return(0);

 return(sum1(tes->left)+sum1(tes->right)+1);
 }
//***************************** showtree subprogram ************************

int showtree(struct tree *test1,int x,int y,int xy)
{
 if(test1==NULL)
  return(0);
 setcolor(1);
 circle(640/x*xy,50*y,10);
 setcolor(4);
 itoa(test1->data,help,10);
 outtextxy(640/x*xy+10,50*y,help);
 if(test1->left!=NULL)
  line(640/x*xy,50*y+10,640/(x*2)*(xy*2-1),50*(y+1)-10);
 showtree(test1->left,x*2,y+1,xy*2-1);
 if(test1->right!=NULL)
  line(640/x*xy,50*y+10,640/(x*2)*(xy*2+1),50*(y+1)-10);
 showtree(test1->right,x*2,y+1,xy*2+1);
 return 0;
}
//******************************** order subprogram *************************

int order(struct tree *test1,int x,int y,int xy,int e)
{
 if(test1==NULL)
  return(0);
 int i;setcolor(e*2);
 if(e==2)
 {
  for(i=1;i<=9;i++)
   circle(640/x*xy,50*y,i);
  delay(1000);
 }
 order(test1->left,x*2,y+1,xy*2-1,e);
 if(e==1)
 {
  for(i=1;i<=9;i++)
   circle(640/x*xy,50*y,i);
  delay(1000);
 }
 order(test1->right,x*2,y+1,xy*2+1,e);
 if(e==3)
 {
  setcolor(14);
  for(i=1;i<=9;i++)
   circle(640/x*xy,50*y,i);
  delay(1000);
 }
return 0;
}