首页 新闻 会员 周边 捐助

二叉树的创建一直在循环无法执行下一步

0
[已关闭问题] 关闭于 2016-12-15 21:43
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include"conio.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

#define TElemType char

typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *LChild,*RChild;
}BiTNode,*BiTree;
 int CreateBiTree(BiTree T)   
{ // 算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),    
// 构造二叉链表表示的二叉树T。变量Nil表示空(子)树。有改动    
TElemType ch;    
scanf("%c",&ch);    
if(ch=='#') //
     T=NULL;   
else    
{       
T=(BiTree)malloc(sizeof(BiTNode)); 
// 生成根结点      
if(!T)         
exit(OVERFLOW);      
T->data=ch;      
CreateBiTree(T->LChild); // 构造左子树     
CreateBiTree(T->RChild); // 构造右子树    
} 
return OK; 
}
//先序遍历
void  PreOrder(BiTree root) 
 /*先序遍历二叉树,  root为指向二叉树(或某一子树)根结点的指针*/
 {  if (root!=NULL)
      {
            printf("%c",root ->data);;    //问根结点
            PreOrder(root ->LChild);    //先序遍历左子树
            PreOrder(root ->RChild);   //先序遍子树
      }
 }
 
void  PostOrder(BiTree root)  
 /* 后序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
 {  if(root!=NULL)
      {
          PostOrder(root ->LChild);  /*后序遍历左子树*/
            PostOrder(root ->RChild);  /*后序遍历右子树* / 
            Visit(root ->data); /*访问根结点*/
      }
  } 
void  InOrder(BiTree root)  
 /*中序遍历二叉树,  root为指向二叉树(或某一子树)根结点的指针*/
 { if (root!=NULL)
      {
          InOrder(root->LChild);    /*中序遍历左子树*/
          printf("%c",root->data); /*访问根结点*/
          InOrder(root->RChild);      /*中序遍历右子树*/
      }
  } 

int Leaf(BiTree root){
    int LeafCount=0;
        if(root!=NULL)
        {
          Leaf(root->LChild); 
          Leaf(root->RChild); 
          if (root ->LChild==NULL && root ->RChild==NULL)
              LeafCount++; 
    }
    return LeafCount;
} 

int PostTreeDepth(BiTree bt){       /* 后序遍历求二叉树高度的递归算法 */

   int hl, hr, max; 
   if(bt!=NULL)
   {
     hl=PostTreeDepth(bt->LChild);    /* 求左子树的深度 */
     hr=PostTreeDepth(bt->RChild);    /* 求右子树的深度 */
     max=hl>hr?hl: hr;        /* 得到左、 右子树深度较大者*/
     return(max+1);        /* 返回树的深度 */
 }
 else return(0);        /* 如果是空树, 则返回0 */
}
void PrintTree(BiTree Bt,char nLayer)   /* 按竖向树状打印的二叉树 */
  {
  if(Bt==NULL) return; 
  PrintTree(Bt->RChild, nLayer+1); 
  for(int i=0; i<nLayer; i++)
       printf("  "); 
  printf("%c\n", Bt->data);                   /*按逆中序输出结点,用层深决定结点的左右位置*/
  PrintTree(Bt->LChild, nLayer+1); 
 } 
int main(){
BiTree T;
int nLayer=1,j;
printf("按扩展先序遍历序列建立一又树,请输入序列:\n");
if(CreateBiTree(T))printf("创建二叉树失败\n");
else printf("创建三叉树成功\n");
printf("先序遍历输出序列为:");
PreOrder (T);
getch();
printf("中序遍历输出序列为:");
InOrder(T);
getch();
printf("后序遍历输出序列为:");
PostOrder(T);
getch();
j=Leaf(T);
printf("二叉树的叶子结点总数为:%d\n",j);
printf("二叉树的高度为%d\n",PostTreeDepth(T));
printf("树桩输出二叉树:");
PrintTree(T,nLayer);
return 0;
}
无上1223的主页 无上1223 | 菜鸟二级 | 园豆:202
提问于:2016-12-15 21:10
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册