主题:二叉树的创建?
lishiyong110
[专家分:300] 发布于 2006-07-30 07:54:00
在学习数据结构的时候,关于二叉树的创建的代码,我怎么总是看不懂啊?他有什么特殊的地方吗?到底应该怎样合理的创建它啊?
回复列表 (共12个回复)
11 楼
kzq1985 [专家分:0] 发布于 2006-12-04 23:12:00
[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 楼
kzq1985 [专家分:0] 发布于 2006-12-04 23:13:00
#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");
}
我来回复