回 帖 发 新 帖 刷新版面

主题:二叉树的基本操作,帮忙看看!调试不出来

//-------二叉树的基本操作-----
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个回复)

沙发

你连二叉树的结构体都没有定义,怎么能运行?
编译程序可不知道Bitree 是什么东西

板凳

Status CreateBiTree(BiTree T)函数的参数需要为二级指针,一级指针是不能带回一个地址值的。另外就像楼上说的,你得把代码贴全了。

3 楼

我在前面已定义了,只不过在程序中没写而已

4 楼

#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 楼

你的CreateBiTree怎样算是完成建立的呢?
怎样判断?

6 楼

为什么要用二级指针阿
有什么不同么?
请教一下

7 楼

并且函数应该怎么写?

8 楼


#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 楼

我还是不懂,这个创建函数的终止条件在哪里?

10 楼

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;
}

我来回复

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