| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 761 人关注过本帖
标题:二叉树创建那有点小问题,能不能帮忙改下
只看楼主 加入收藏
Heart→M鹏
Rank: 2
等 级:论坛游民
帖 子:80
专家分:94
注 册:2011-5-13
结帖率:83.33%
收藏
 问题点数:0 回复次数:7 
二叉树创建那有点小问题,能不能帮忙改下
程序代码:
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct BiTreeNode
{
   char data;
   struct BiTreeNode *lchild,*rchild;
}BTNode;
BTNode *Create_BiTree()//二叉树的建立
{//用辅助数组建立二叉树
   int i,j;
   char ch;
   BTNode *s,*t,*p[MAXSIZE];
   printf("输入顶点编号i及信息ch,输入0和#结束:i,ch  \n");
   scanf("%d,%c",&i,&ch);
   while(i==0||ch=='#') break;
   while(i!=0&&ch!='#'){                 //建立二叉树的存储结构
       s=(BTNode *)malloc(sizeof(BTNode));
       s->data=ch;
       s->lchild=s->rchild=NULL;                                                                                                                                                                                                                                                                              
       p[i]=s;
       if(i==1) t=s;//判断输入结点是根结点、左孩子还是右孩子
       else
         {j=i/2;
          if(i%2==0) p[j]->lchild=s;
          else p[j]->rchild=s;
         }
      
   }
   return t;
}// Create_BiTree
void  Preorder(BTNode *bt)
{//前序递归遍历
    if(bt)
    {
          printf("%c",bt->data);
          Preorder(bt->lchild);
          Preorder(bt->rchild);
    }
}/* Preorder*/
void  Inorder(BTNode *bt){//中序递归遍历
    if(bt)
    {
       Inorder(bt->lchild);
       printf("%c",bt->data);
       Inorder(bt->rchild);
    }
}//Inorder
void  Postorder(BTNode *bt){//后序递归遍历
        if(bt)
     {
           Postorder(bt->lchild);
           Postorder(bt->rchild);
           printf("%c",bt->data);
     }
   }//Postorder
 main()
{
  int j=1;
  BTNode *T;
  T=Create_BiTree();
  while(j)
   {
     printf("\n"); //功能菜单
     printf("请选择操作:\n");
     printf("1:  二叉树的前序遍历\n");
     printf("2:  二叉树的中序遍历\n");
     printf("3:  二叉树的后序遍历\n");
     printf("0:  退出程序\n");
     scanf("%d",&j);
     if(j<0||j>3)
     printf("你的输入有误,请重新选择!\n");
     switch(j)
     {                                                         
         case 0: printf(" 程序退出!\n ");break;
         case 1: printf("前序遍历结果:\n"); Preorder(T); break;
         case 2: printf("中序遍历结果:\n"); Inorder(T);break;
         case 3: printf("后序遍历结果:\n"); Postorder(T);break;
         default : printf("\n输入无效,请重新选择操作!\n" );break;
      }
   }
}
以二叉链表作存储结构的二叉树,然后按先序、中序、后序顺序分别遍历这棵二叉树
搜索更多相关主题的帖子: 二叉树 
2011-07-04 09:22
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
二叉树的建立 就你上面的代码 能建立吗
2011-07-04 11:45
Heart→M鹏
Rank: 2
等 级:论坛游民
帖 子:80
专家分:94
注 册:2011-5-13
收藏
得分:0 
回复 2楼 寒风中的细雨
有错误···能帮忙改正一下吗?我改成这样
程序代码:
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct BiTreeNode
{
   char data;
   struct BiTreeNode *lchild,*rchild;
}BTNode;
BTNode *Create_BiTree()//二叉树的建立
{//用辅助数组建立二叉树
   int i,j;
   char ch;
   BTNode *s,*t,*p[MAXSIZE];
   printf("输入顶点编号i及信息ch,输入0和#结束:i,ch  \n");
   scanf("%d,%c",&i,&ch);
   while(i==0||ch=='#') break;
   while(i!=0&&ch!='#'){                 //建立二叉树的存储结构
       s=(BTNode *)malloc(sizeof(BTNode));
       s->data=ch;
       s->lchild=s->rchild=NULL;                                                                                                                                                                                                                                                                             
       p[i]=s;
       if(i==1) t=s;//判断输入结点是根结点、左孩子还是右孩子
       else
         {j=i/2;
          if(i%2==0) p[j]->lchild=s;
          else p[j]->rchild=s;
         }
      printf("输入顶点编号i及信息ch,输入0和#结束:i,ch  \n");
      scanf("%d,%c",&i,&ch);
   }
   return t;
}// Create_BiTree
void  Preorder(BTNode *bt)
{//前序递归遍历
    if(bt)
    {
          printf("%c",bt->data);
          Preorder(bt->lchild);
          Preorder(bt->rchild);
    }
}/* Preorder*/
void  Inorder(BTNode *bt){//中序递归遍历
    if(bt)
    {
       Inorder(bt->lchild);
       printf("%c",bt->data);
       Inorder(bt->rchild);
    }
}//Inorder
void  Postorder(BTNode *bt){//后序递归遍历
        if(bt)
     {
           Postorder(bt->lchild);
           Postorder(bt->rchild);
           printf("%c",bt->data);
     }
   }//Postorder
main()
{
  int j=1;
  BTNode *T;
  T=Create_BiTree();
  while(j)
   {
     printf("\n"); //功能菜单
     printf("请选择操作:\n");
     printf("1:  二叉树的前序遍历\n");
     printf("2:  二叉树的中序遍历\n");
     printf("3:  二叉树的后序遍历\n");
     printf("0:  退出程序\n");
     scanf("%d",&j);
     if(j<0||j>3)
     printf("你的输入有误,请重新选择!\n");
     switch(j)
     {                                                        
         case 0: printf(" 程序退出!\n ");break;
         case 1: printf("前序遍历结果:\n"); Preorder(T); break;
         case 2: printf("中序遍历结果:\n"); Inorder(T);break;
         case 3: printf("后序遍历结果:\n"); Postorder(T);break;
         default : printf("\n输入无效,请重新选择操作!\n" );break;
      }
   }
}
运行不报错但是有错误···能帮忙改正一下吗?我改成这样  
2011-07-04 16:35
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
你 能不能提供一个 测试数据(有问题的)
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-07-04 20:44
Heart→M鹏
Rank: 2
等 级:论坛游民
帖 子:80
专家分:94
注 册:2011-5-13
收藏
得分:0 
回复 4楼 寒风中的细雨
不会发图,昨天给你发的图全部都没显示··· 我的二叉树用这样的方式创建应该没问题吧?有没有其他的方法,能不能给个参考下?

[ 本帖最后由 Heart→M鹏 于 2011-7-5 09:23 编辑 ]
2011-07-05 09:01
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
程序代码:
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct BiTreeNode//二叉树的存储结构
{
    char data;
    struct BiTreeNode *lchild,*rchild;
}BTNode;
BTNode *Create_BiTree()//二叉树的建立
{    //用辅助数组建立二叉树
    int i,j;
    char ch;
    BTNode *s,*t,*p[MAXSIZE];
    printf("输入顶点编号i及信息ch,输入0和#结束:i,ch  \n");
       while(1)
    {                 
        scanf("%d,%c",&i,&ch);
        if(i==0&&ch=='#') 
            break;
        s=(BTNode *)malloc(sizeof(BTNode));
        s->data=ch;
        s->lchild=s->rchild=NULL;                                                                                                                                                                                                                                                                              
        p[i]=s;
        if(i==1) //根结点
            t=s;//判断输入结点是根结点、左孩子还是右孩子
        else
        {
            j=i/2;
            if(i%2==0) p[j]->lchild=s;
            else p[j]->rchild=s;
        }
      
    }
    return t;
}// Create_BiTree
void  Preorder(BTNode *bt)
{    //前序递归遍历
    if(bt)
    {
          printf("%c",bt->data);
          Preorder(bt->lchild);
          Preorder(bt->rchild);
    }
}/* Preorder*/
void  Inorder(BTNode *bt){//中序递归遍历
    if(bt)
    {
       Inorder(bt->lchild);
       printf("%c",bt->data);
       Inorder(bt->rchild);
    }
}//Inorder
void  Postorder(BTNode *bt){//后序递归遍历
        if(bt)
     {
           Postorder(bt->lchild);
           Postorder(bt->rchild);
           printf("%c",bt->data);
     }
   }//Postorder
int main()
{
    int j=1;
    BTNode *T;
    T=Create_BiTree();
    while(j)
    {
        printf("\n"); //功能菜单
        printf("请选择操作:\n");
        printf("1:  二叉树的前序遍历\n");
        printf("2:  二叉树的中序遍历\n");
        printf("3:  二叉树的后序遍历\n");
        printf("0:  退出程序\n");
        scanf("%d",&j);
        if(j<0||j>3)
            printf("你的输入有误,请重新选择!\n");
        switch(j)
        {                                                         
         case 0: printf(" 程序退出!\n ");break;
         case 1: printf("前序遍历结果:\n"); Preorder(T); break;
         case 2: printf("中序遍历结果:\n"); Inorder(T);break;
         case 3: printf("后序遍历结果:\n"); Postorder(T);break;
         default : printf("\n输入无效,请重新选择操作!\n" );break;
        }
    }
    return 0;
}

楼主在输入数据时貌似出现了问题,对比一下我上面的。

A real warrior never quits.
2011-08-14 15:32
leizisdu
Rank: 2
等 级:论坛游民
帖 子:22
专家分:24
注 册:2011-10-17
收藏
得分:0 
回复 3楼 Heart→M鹏
您改成这样后还有错误?
我在自己机子上用VC6.0运行您的程序(直接COPY)没问题啊,不过Create_BiTree()中,最好是在声明BTNode *t后,立即将t初始化为NULL。
2011-10-21 09:46
leizisdu
Rank: 2
等 级:论坛游民
帖 子:22
专家分:24
注 册:2011-10-17
收藏
得分:0 
回复 3楼 Heart→M鹏
楼主,又有新进展:当第一个顶点编号不是1时,发生运行时错误!
错误的原因在于:BTNode *p[MAXSIZE]是个“指针”数组,而您又未进行初始化,以使其指向有效的地址空间!
另外:您定义BTNode *s;有什么用意吗?我觉得这个s完全没有必要啊?
在您的基础上修改后代码如下:
程序代码:
BTNode *Create_BiTree()//二叉树的建立
{//用辅助数组建立二叉树
   int i,j;
   char ch;
   //BTNode *s = NULL;
   BTNode *t = NULL;
   BTNode *p[MAXSIZE] = {NULL};  // 存放的只不过是指针! SLL, 2011-10-21
   printf("输入顶点编号i及信息ch,输入0和#结束:i,ch  \n");
   scanf("%d,%c",&i,&ch);
   while(i==0||ch=='#') break;
   while(i!=0&&ch!='#'){                 //建立二叉树的存储结构
      if (p[i] == NULL)
      {
         p[i] = (BTNode *)malloc(sizeof(BTNode));
         p[i]->lchild = p[i]->rchild=NULL;
      }
      p[i]->data=ch;
      //p[i]=s;
      if(i==1) 
      {
         //t=s;//判断输入结点是根结点、左孩子还是右孩子
         t = p[i];
      }
      else
      {
         j=i/2;
         if (p[j] == NULL)
         {
            p[j] = (BTNode *)malloc(sizeof(BTNode));
            p[j]->lchild = p[j]->rchild = NULL;
         }
         if(i%2==0) 
         {
            p[j]->lchild=p[i];   // SLL, 2011-10-21
         }
         else 
         {
            p[j]->rchild=p[i];
         }
      }
      printf("输入顶点编号i及信息ch,输入0和#结束:i,ch  \n");
      scanf("%d,%c",&i,&ch);
   }
   return t;
}// Create_BiTree
2011-10-21 10:52
快速回复:二叉树创建那有点小问题,能不能帮忙改下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028540 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved