主题:请教数据结构问题
jiangtaomin
[专家分:0] 发布于 2006-06-22 16:26:00
课程设计:
二叉树的遍历及应用。
[问题描述]建立二叉树,并输出二叉树的先序、中序和后序遍历序列,以及二叉树的叶子数。
[实现提示]可通过输入带空格的前序序列建立二叉链表。
回复列表 (共3个回复)
沙发
euc [专家分:4310] 发布于 2006-06-22 17:40:00
输入格式是不是这样:
root
left
lleft
lright
right
rleft
rright
板凳
中国台湾 [专家分:2140] 发布于 2006-06-25 00:51:00
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#define INITSTACKSIZE 100
#define INCREMENT 10
#define TURE 1
#define ERROR 0
#define OK 1
#define M 100
typedef int SElemType;
typedef int status ;
static int number=1;
typedef struct bitnode//定义一个2叉数
{
char data;
struct bitnode *lchild ,*rchild;
}bitnode ,*bitree;
int CreatBitree(bitree *T)//建立一个2叉树
{
char ch;
printf("请输入字符:");
scanf("%c",&ch);
getchar();//吃掉残留的数据
if ( ch ==' ')
{
(*T)=NULL;
return 0;
}
else
{
(*T) = (bitree)malloc(sizeof(bitnode));
if((*T) == NULL)
{
printf("memory allocation failed,goodbye");
exit(1);
}
(*T)->data=ch;
CreatBitree(&(*T)->lchild);
CreatBitree(&(*T)->rchild);
}
return OK;
}
void PreOrderTraverse1(bitree T)// 前序遍历递归形式
{
if(T)
{
printf("%c",T->data);
PreOrderTraverse1((*T).lchild);
PreOrderTraverse1((*T).rchild);
}
}
void PreOrderTraverse2(bitree T)// 前序遍历非递归形式
{
int top = 0;
bitree a[M];
while (T!=NULL||top!=0)
{
while ( T!=NULL)
{
printf("%c",T->data);
a[++top] = T;
T = T->lchild;
}
if(top > 0)
{
T = a[top--];
T = T->rchild;
}
}
}
void InOrderTraverse1(bitree T)//中序递归形式访问
{
if(T)
{
InOrderTraverse1(T->lchild);
printf("%c",T->data);
InOrderTraverse1(T->rchild);
}
}
void InOrderTraverse2(bitree T)//中序非递归形式
{
int top = 0;
bitree s[M];
while(T!=NULL||top!=0)
{
while(T!=NULL)
{
s[++top] = T;
T = T->lchild;
}
if (top>0)
{
T = s[top--];
printf("%c",T->data);
T = T->rchild;
}
}
}
void BerforOrderTraverse1(bitree T)//后序递归形式
{
if(T)
{
BerforOrderTraverse1((*T).lchild);
BerforOrderTraverse1((*T).rchild);
printf("%c",T->data);
}
}
void BerforOrderTraverse2(bitree t) //后序非递归形式
{
typedef struct node
{
bitree t;
int tag;
} stack;
stack s[100] ;
int top=0;
while (t!=NULL|| top!=0)
{
while (t!=NULL)
{
s[++top].t=t;
s[top].tag=0;
t=t->lchild;
}
while (top!=0 && s[top].tag==1)
{
printf("%c" ,s[top--].t->data);
}
if (top)
{
s[top].tag=1;
t = s[top].t->rchild ;
}
}
}
status Depth(bitree T) //求树的深度
{
int i = 0;
int j = 0;
if(!T)
{
return 0;
}
else
{
i = Depth(T->lchild);
j = Depth(T->rchild);
return ((i>j?i:j)+1);
}
}
status Node2(bitree T)//求度为2的结点个数
{
int i = 0;
int j = 0;
if(!T)
{
return 0;
}
else
{
j = Node2(T->lchild);
i = Node2(T->rchild);
if(i!=0&&j!=0)
return (i+j+1);
else
return (i+j);
}
}
int Node(bitree T)//求所有的接点数
{
int i=0;
int j=0;
if(!T)
{
return 0;
}
else
{
i = Node(T->lchild);
j = Node(T->rchild);
return (i+j+1);
}
}
int Node0(bitree T)//叶子接点的个数
{
int i ,j;
if(!T)
{
return 0;
}
else
{
i = Node0(T->lchild);
j = Node0(T->rchild);
if(i==0&&j==0)
return (i+j+1);
else
return (i+j);
}
}
3 楼
中国台湾 [专家分:2140] 发布于 2006-06-25 00:51:00
void locate(bitree t, char x)
{
bitree p;
p=t;
if (t == NULL)
printf("0\n");
else if( t->data == x)
printf("%d\n",p->data);
else
{
p=t->lchild;
if (p)
locate(t->lchild, x);
else
locate(t->rchild, x);
}
}
int main(void)
{
bitree T;
int choose;
char num;
int flag = 1, sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
CreatBitree(&T);
while(1)
{
printf("\n");
do
{
printf("1:***************** 先序递归遍历形式\n");
printf("2:***************** 先序非递归遍历形式\n");
printf("3:***************** 中序递归遍历形式\n");
printf("4:***************** 中序非递归遍历形式\n");
printf("5:***************** 后序递归遍历形式\n");
printf("6:***************** 后序非递归遍历形式\n");
printf("7:***************** 计算所有结点个数\n");
printf("8:***************** 计算叶子结点个数\n");
printf("9:***************** 算度为2的结点个数\n");
printf("10:**************** 计算树的深度\n");
printf("11:**************** 查到相同的元素\n");
printf("12:**************** 退出\n");
printf("请选择你需要执行的任务:");
scanf("%d",&choose);
if(choose == 12)
{
flag = 0;
}
}while(choose<0||choose>12);
if(flag==0)
{
break;
}
switch(choose)
{
case 1:
{
printf("\n先序递归遍历形式:");
PreOrderTraverse1(T);
printf("\n");
}
break;
case 2:
{
printf("\n先序非递归遍历形式:");
PreOrderTraverse2(T);
printf("\n");
}
break;
case 3:
{
printf("\n中序递归遍历形式:");
InOrderTraverse1(T);
printf("\n");
}
break;
case 4:
{
printf("\n中序非递归遍历形式:");
BerforOrderTraverse1(T);
printf("\n");
}
break;
case 5:
{
printf("\n后序递归遍历形式:");
BerforOrderTraverse1(T);
printf("\n");
}
break;
case 6:
{
printf("\n后序非递归遍历形式\n");
BerforOrderTraverse2(T);
}
break;
case 7:
{
printf("\n计算所有结点个数:");
sum1 = Node(T);
printf("%d\n",sum1);
}
break;
case 8:
{
printf("\n计算叶子结点个数:");
sum2 =Node0( T);
printf("%d\n",sum2);
}
break;
case 9:
{
printf("计算度为2的结点个数:");
sum3 = Node2(T);
printf("%d\n",sum3);
}
break;
case 10:
{
printf("计算树的深度:");
sum4 = Depth(T) ;
printf("%d\n",sum4);
}
break;
case 11:
{
printf("请输入需要查找的元素:");
scanf("%c",&num);
getchar();
locate(T, num);
}
break;
default:
{
break;
}
}
}
system("pause");
return 0;
}
我来回复