主题:二叉树的基本操作,帮忙看看!调试不出来
zjkzxy
[专家分:310] 发布于 2006-11-01 17:52:00
//-------二叉树的基本操作-----
Status CreateBiTree(BiTree T)
{//先序序列创建一棵二叉树
char ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else
{T=(BiTree)malloc(sizeof(BiTNode));
if(!T) return ERROR;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
void PreOrderTraverse(BiTree T)
{//二叉树的先序遍历
if(T)
{printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{////二叉树的中序遍历
if(T)
{InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{//二叉树的后序遍历
if(T)
{PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
int CountLeaf(BiTree T)
{//计算二叉树的叶子结点数
int m,n;
if(T==NULL) return 0;
else if(!T->lchild&& !T->rchild) return 1;
else
{m=CountLeaf(T->lchild);
n=CountLeaf(T->rchild);
return(m+n);
}
}
int BiTreeDepth(BiTree T)
{//计算二叉树的深度
int depthval,ldepthval,rdepthval;
if(!T) depthval=0;
else if(!T->lchild && !T->rchild) depthval=1;
else
{ldepthval=BiTreeDepth(T->lchild);
rdepthval=BiTreeDepth(T->rchild);
depthval=ldepthval>rdepthval?ldepthval:rdepthval+1;
}
return depthval;
}
main()
{BiTree T;
printf("请输入创建一棵二叉树的先序序列:");
CreateBiTree(T);
printf("先序序列为:");
PreOrderTraverse(T);
printf("\n中序序列为:");
InOrderTraverse(T);
printf("\n后序序列为:");
PostOrderTraverse(T);
printf("二叉树所含叶子结点数为:%d",CountLeaf(T));
printf("\n二叉树的深度为:%d\n",BiTreeDepth(T));
}
回复列表 (共13个回复)
沙发
avenger07 [专家分:160] 发布于 2006-11-02 00:51:00
你连二叉树的结构体都没有定义,怎么能运行?
编译程序可不知道Bitree 是什么东西
板凳
boxertony [专家分:23030] 发布于 2006-11-02 08:43:00
Status CreateBiTree(BiTree T)函数的参数需要为二级指针,一级指针是不能带回一个地址值的。另外就像楼上说的,你得把代码贴全了。
3 楼
zjkzxy [专家分:310] 发布于 2006-11-02 08:57:00
我在前面已定义了,只不过在程序中没写而已
4 楼
zjkzxy [专家分:310] 发布于 2006-11-02 08:58:00
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define NULL 0
typedef int Status;
typedef struct BiTNode
{char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//-------二叉树的基本操作-----
Status CreateBiTree(BiTree T)
{//先序序列创建一棵二叉树
char ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else
{T=(BiTree)malloc(sizeof(BiTNode));
if(!T) return ERROR;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
void PreOrderTraverse(BiTree T)
{//二叉树的先序遍历
if(T)
{printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{////二叉树的中序遍历
if(T)
{InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{//二叉树的后序遍历
if(T)
{PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
int CountLeaf(BiTree T)
{//计算二叉树的叶子结点数
int m,n;
if(T==NULL) return 0;
else if(!T->lchild&& !T->rchild) return 1;
else
{m=CountLeaf(T->lchild);
n=CountLeaf(T->rchild);
return(m+n);
}
}
int BiTreeDepth(BiTree T)
{//计算二叉树的深度
int depthval,ldepthval,rdepthval;
if(!T) depthval=0;
else if(!T->lchild && !T->rchild) depthval=1;
else
{ldepthval=BiTreeDepth(T->lchild);
rdepthval=BiTreeDepth(T->rchild);
depthval=ldepthval>rdepthval?ldepthval:rdepthval+1;
}
return depthval;
}
main()
{BiTree T;
printf("请输入创建一棵二叉树的先序序列:");
CreateBiTree(T);
printf("先序序列为:");
PreOrderTraverse(T);
printf("\n中序序列为:");
InOrderTraverse(T);
printf("\n后序序列为:");
PostOrderTraverse(T);
printf("二叉树所含叶子结点数为:%d",CountLeaf(T));
printf("\n二叉树的深度为:%d\n",BiTreeDepth(T));
}
5 楼
ggggdfei [专家分:0] 发布于 2006-11-02 15:47:00
你的CreateBiTree怎样算是完成建立的呢?
怎样判断?
6 楼
ggggdfei [专家分:0] 发布于 2006-11-02 16:29:00
为什么要用二级指针阿
有什么不同么?
请教一下
7 楼
ggggdfei [专家分:0] 发布于 2006-11-02 16:35:00
并且函数应该怎么写?
8 楼
xieyong456 [专家分:2620] 发布于 2006-11-02 16:52:00
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define NULL ((void *)0)
typedef int Status;
typedef struct BiTNode
{char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//-------二叉树的基本操作-----
void CreateBiTree(BiTree *T)
{//先序序列创建一棵二叉树
char ch;
scanf("%c",&ch);
if(ch==' ') *T=NULL;
else
{
if(!((*T) = (BiTNode *)malloc(sizeof(BiTNode))))
{
exit(1);
}
(*T)->data = ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
void PreOrderTraverse(BiTree T)
{//二叉树的先序遍历
if(T)
{printf(" %c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{////二叉树的中序遍历
if(T)
{InOrderTraverse(T->lchild);
printf(" %c",T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{//二叉树的后序遍历
if(T)
{PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf(" %c",T->data);
}
}
int CountLeaf(BiTree T)
{//计算二叉树的叶子结点数
int m,n;
if(T==NULL) return 0;
else if(!T->lchild&& !T->rchild) return 1;
else
{m=CountLeaf(T->lchild);
n=CountLeaf(T->rchild);
return(m+n);
}
}
int BiTreeDepth(BiTree T)
{//计算二叉树的深度
int depthval,ldepthval,rdepthval;
if(!T) depthval=0;
else if(!T->lchild && !T->rchild) depthval=1;
else
{ldepthval=BiTreeDepth(T->lchild);
rdepthval=BiTreeDepth(T->rchild);
depthval=ldepthval>rdepthval?ldepthval:rdepthval+1;
}
return depthval;
}
main()
{
BiTree T;
printf("请输入创建一棵二叉树的先序序列:");
CreateBiTree(&T);
printf("先序序列为:");
PreOrderTraverse(T);
printf("\n中序序列为:");
InOrderTraverse(T);
printf("\n后序序列为:");
PostOrderTraverse(T);
printf("\n二叉树所含叶子结点数为:%d",CountLeaf(T));
printf("\n二叉树的深度为:%d\n",BiTreeDepth(T));
getch();
}
恩,二级指针才会返回
否则不会运行下去了~
9 楼
芷刀雪狐 [专家分:0] 发布于 2006-11-17 18:12:00
我还是不懂,这个创建函数的终止条件在哪里?
10 楼
orangelegend [专家分:860] 发布于 2006-11-17 23:17:00
8楼是高手啊。
如果你是用VC的话只要改一下这个就行了。
Status CreateBiTree(BiTree &T)//VC中用的是&,TC中可能用的是*,不太清楚
{//先序序列创建一棵二叉树
char ch;
fflush(stdin);//这个也是有用的。
scanf("%c",&ch);
getchar();//你原来就这么写的
if(ch==' ') T=NULL;
else
{T=(BiTree)malloc(sizeof(BiTNode));
if(!T) return ERROR;
T->data=ch;
printf("%c的左结点:",ch);
CreateBiTree(T->lchild);
printf("%c的右结点",ch);
CreateBiTree(T->rchild);
}
return OK;
}
我来回复