回 帖 发 新 帖 刷新版面

主题:二叉树的创建?

在学习数据结构的时候,关于二叉树的创建的代码,我怎么总是看不懂啊?他有什么特殊的地方吗?到底应该怎样合理的创建它啊?

回复列表 (共12个回复)

11 楼

[quote]看看行不行:

#include"malloc.h"
#include"stdio.h"


typedef struct three1
{char data;
struct  three1 *l;
struct three1 *r;
}tree;

int g=0,d=0,x=0,y=0;
tree *creat(void)
{ tree *q;
d++;
char ch,mm;
scanf("%c",&mm);
printf("NO.%d\n",d);
scanf("%c",&ch);
if(ch==' ')
       {    q=NULL;
       return NULL;}
else
{

    q=(tree *)(malloc(sizeof(tree)));
    q->data=ch;
    q->l=creat();
    q->r=creat();

}

return q;
}



void visit1(tree *f)
{g++;
    if(f!=NULL)
{if(g==1)
    goto look_1;
    /*printf("(->)");*/
look_1:
    printf("%c",f->data);
visit1(f->l);
visit1(f->r);
}
/*else
    printf("(->)@");
*/}
    
void    visit2(tree *k)
{x++;

    if(k!=NULL)
{if(x==1)
    goto look_1;
    /*printf("(->)");
*/look_1:
    
visit2(k->l);
printf("%c",k->data);
visit2(k->r);
}
/*else
    printf("(->)@");
*/}
    
    
void visit3(tree *b)
{y++;
    if(b!=NULL)
{if(y==1)
    goto look_1;
    /*printf("(->)");
*/look_1:
    
visit3(b->l);

visit3(b->r);
printf("%c",b->data);
}
/*else
    printf("(->)@");
*/}


main()
{tree *head;

    int fage;
int i;
fage=1;
printf("注意在第一次使用时必须先建立二杈树.\n");
do{ printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
printf("\t*******菜单栏**************\n");
printf("\t1----------建立二杈树.\n");
printf("\t2----------先序遍历二杈树.\n");
printf("\t3----------中序遍历二杈树.\n");
printf("\t4----------后序遍历二杈树.\n");
printf("\t0----------退出\n");
printf("\t**************************\n");
printf("\n");
printf("请选择(注意:一定要是数字):\n");
scanf("%d",&i);
switch(i)
{
case 0:fage=0;break;
case 1: printf("开始:\n");head=creat(); break;
case 2: visit1(head);break;
case 3:visit2(head);break;
case 4:visit3(head);break;
defult:printf("您的选择错误.\n");
}
}

while (fage);
return 1;
}[/quote]

这个好像不行...看看我的

12 楼

#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define S_INIT_SIZE 100  //存储空间初时分配量
#define SINCREMENT 10   //存储空间分配增量
typedef int Status;
typedef struct BTNode
{  //二叉树的二叉链表存储表示
    char data;
    struct BTNode *lchild,*rchild;  //左右孩子指针
}BTNode,*BT;
typedef struct
{  BT *base;
   BT *top;   //栈顶指针
   int stacksize;  //当前已经分配的存储空间,以元素为单位
}SqS;
Status InitS(SqS &S)
{  //构造一个空栈
    S.base=(BT *)malloc(S_INIT_SIZE*sizeof(BT));
    if(!S.base) exit(OVERFLOW);  //存储分配失败
    S.top=S.base;
    S.stacksize=S_INIT_SIZE;
    return OK;
}//InitS
Status Gettop(SqS S, BT &e)
{  if(S.top==S.base) return ERROR;
   e=*(S.top-1);
   return OK;
}//Gettop
Status Push(SqS &S,BT e)
{  //插入元素为e的栈顶元素
    if(S.top-S.base>=S.stacksize)
    {  //栈满,追加存储空间'
        S.base=(BT *)realloc(S.base,(S.stacksize+SINCREMENT)*sizeof(BT));
        if(!S.base) exit(OVERFLOW);  //存储分配失败
        S.top=S.base+S.stacksize;
        S.stacksize+=SINCREMENT;
    }
    *S.top++=e;
    return OK;
}//Push
Status Pop(SqS &S,BT &e)
{  if(S.top==S.base) return ERROR;
   e=*--S.top;
   return OK;
}//Pop
Status SEmpty(SqS S)
{  if(S.top==S.base) return OK;
   return ERROR;
}//SEmpty
Status CreatBT(BT &T)
{  //构造二叉链表表示的二叉树
    char ch;
    scanf("%c",&ch);
    if(ch==' ') T=NULL;
    else
    {  if(!(T=(BTNode *)malloc(sizeof(BTNode)))) exit(OVERFLOW);
       T->data=ch; //生成跟结点
        CreatBT(T->lchild);  //构造左子树
       CreatBT(T->rchild);  //构造右子树
    }
    return OK;
}//CreatBT
Status Output(char e)
{  printf("%c ",e);
   return OK;
}
Status Inorder(BT T,Status(*Output)(char ch))
{   BT p; SqS S; 
    InitS(S);  p=T;
    while(p||!SEmpty(S))
    {  if(p){Push(S,p); p=p->lchild;}//根指针进栈,遍历左子树
       else 
       {  //根指针退栈,访问根结点,遍历右子树
          Pop(S,p); if(!Output(p->data)) return ERROR;
          p=p->rchild;
       }// else
    }//while
    return OK;
}//Inorder
Status Traverse(BT T,Status(*Output)(char ch))
{  
    if(T)
    {  
        if(Traverse(T->lchild,Output))
            if(Output(T->data))
                if(Traverse(T->rchild,Output))  return OK;
        return ERROR;
    }
    else return OK;
}//Traverse
void main()
{   BT T;
    printf("请出入:");
    CreatBT(T);
    printf("递归输出:");
    Traverse(T,Output);
    printf("\n");
    printf("非递归输出:");
    Inorder(T,Output);
    printf("\n");
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册