| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 643 人关注过本帖
标题:C语言二叉树的遍历问题,照着他人的代码练习的,实在是自己找不出错误的地方 ...
只看楼主 加入收藏
gg0013
Rank: 2
等 级:论坛游民
帖 子:25
专家分:16
注 册:2012-11-26
结帖率:100%
收藏
已结贴  问题点数:43 回复次数:2 
C语言二叉树的遍历问题,照着他人的代码练习的,实在是自己找不出错误的地方了,明白的还望帮忙看下 谢谢
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>

#define  Max 20               //节点最大数

typedef char DataType;

typedef struct BitNode              //二叉树结构体
{
  DataType data;
  struct BitNode *lchild,*rchild;
}BitNode,*BitTree;

typedef  struct stackelem            //栈的结构体
{
   BitNode  *a[Max];
   int top;
}Stack;


void BinTreeCreat(BitNode *BT)      //利用递归的方式创建二叉树      
{
  char ch;
  scanf("%c",&ch);
  while(ch!='#')
  {
    BitNode *BT=(BitNode *)malloc(sizeof(BitNode));
 BT->data=ch;                           //生成根节点
 BinTreeCreat(BT->lchild);              //构造左子树
 BinTreeCreat(BT->rchild);              //构造右子树
  }
}


void PreOrderBinTraverse(BitNode *BT)              //构建先序遍历
{
  if(NULL!=BT)                                     //为了防止把NULL赋值给BT
  {
    printf("%c",BT->data);
    PreOrderBinTraverse(BT->lchild);
 PreOrderBinTraverse(BT->rchild);
  }
}

void PreOrderBinTraverse2(BitNode *BT)             //利用栈来弹出输出数据
{
    BitNode *p;
 Stack s;
    s.top=-1;
 if(NULL==BT)
 {
     return;
 }
 else
 {
    s.top++;
       s.a[s.top]=BT;
    while(s.top!=-1)
    {
     p=s.a[s.top];
     s.top--;
     printf("%c",p->data);                  //这里是弹出什么 ? 是怎么入栈出栈的?
           if(p->rchild!=NULL)
     {
        s.top++;
     s.a[s.top]=p->rchild;
     }
     if(p->lchild!=NULL)
     {
       s.top++;
    s.a[s.top]=p->lchild;
     }
    }
 }
}

void InOrderBinTraverse(BitNode *BT)                //中序遍历
{
    if (NULL!=BT)
    {
        InOrderBinTraverse(BT->lchild);
        printf("%c ",BT->data);
        InOrderBinTraverse(BT->rchild);
    }
}


void InOrderBinTraverse2(BitNode *BT)
{
      BitNode *p,*q;
   Stack s;
   s.top=-1;
   if(NULL==BT)
   {
      return;
   }
   else
   {
    while(BT!=NULL)
    {
       s.top++;
    s.a[s.top]=BT;
    BT=BT->lchild;                  //指向最左下方            
    }
    while(p->lchild!=NULL)
    {
       p=s.a[s.top];
    s.top--;
    printf("%c",p->data);              //弹出最左下方的
    while(p->rchild!=NULL)              //第一次是判断,最左下方的右子树
    {
       s.top++;
    s.a[s.top]=p->rchild;
    q=p->rchild;
    while(q->lchild!=NULL)
    {
       s.top++;
       s.a[s.top]=q->lchild;
       q=q->lchild;
    }
    break;
    }
    }
   }
}


void PostOrderBinTraverse(BitNode *BT)                  //后序遍历
{
    if(BT!=NULL)
 {
  PostOrderBinTraverse(BT->lchild);
        PostOrderBinTraverse(BT->rchild);
  printf("%c",BT->data);
 }
}


void PostOrderBinTraverse2(BitNode *BT)   
{
    Stack s;
    s.top=-1;
    BitNode *t;
    int flag;
    do
    {
        while (BT!=NULL)
        {
            s.top++;
            s.a[s.top]=BT;
            BT=BT->lchild;
        }
        t=NULL;
        flag=1;
        while (s.top!=-1 && flag)
        {
            BT=s.a[s.top];
            if (BT->rchild==t)           //t:表示为null,或者右子节点被访问过了。
            {
                printf("%c ",BT->data);
                s.top--;
                t=BT;                    //t记录下刚刚访问的节点
            }
            else
            {
                BT=BT->rchild;
                flag=0;
            }
        }
    } while (s.top!=-1);
}

int Height(BitNode *BT)             //求高度
{
    int depth1,depth2;
    if (NULL==BT)
    {
        return 0;
    }
    else
    {
        depth1=Height(BT->lchild);
        depth2=Height(BT->rchild);
        if (depth1>depth2)
        {
            return (depth1+1);
        }
        else
        {
            return (depth2+1);
        }
    }
}


int main()
{
    BitNode *btr;
    BinTreeCreat(btr);
    printf("前序遍历:递归和非递归实现:\n");
    PreOrderBinTraverse(btr);
    printf("\n");
    PreOrderBinTraverse2(btr);
    printf("\n");
    printf("中序遍历:递归和非递归实现:\n");
    InOrderBinTraverse(btr);
    printf("\n");
    InOrderBinTraverse2(btr);
    printf("\n");
    printf("后序遍历:递归和非递归实现:\n");
    PostOrderBinTraverse(btr);
    printf("\n");
    PostOrderBinTraverse2(btr);
    printf("\n");
    printf("二叉树的高度:\n");
    int Hgt=Height(btr);
    printf("%d \n",Hgt);
    printf("\n");
    return 0;
}


还有前序遍历时候的, 那p->data的问题, 麻烦帮忙解决一下下了,最好是多给点注释, 真心感谢了。
搜索更多相关主题的帖子: C语言 二叉树 include 练习 
2013-06-02 01:45
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:31 
《C Primer Plus》后面有一章讲高级数据类型,里面有二叉树的实现,你可以对照看看

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-06-02 12:46
gg0013
Rank: 2
等 级:论坛游民
帖 子:25
专家分:16
注 册:2012-11-26
收藏
得分:0 

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<malloc.h>

 

#define  Max 20               //节点最大数

 

typedef char DataType;

 

typedef struct BitNode              //二叉树结构体

{

    DataType data;

    struct BitNode *lchild,*rchild;

}BitNode,*BitTree;

 

typedef  struct stackelem            //栈的结构体

{

   BitNode  *a[Max];

   int top;

}Stack;

 

 

void BinTreeCreat(BitNode *&BT)      //利用递归的方式创建二叉树      

{

    char ch;

    scanf("%c",&ch);

    fflush(stdin);

    if(ch!='#')

    {

        BT=(BitNode *)malloc(sizeof(BitNode));

        //我不知道你为什么要写BitNode *BT=(BitNode *)malloc(sizeof(BitNode));,

        //这样做把传入的BT屏蔽了,无法修改传入的BT的值你还怎么创建二叉树啊

         

        BT->data=ch;                           //生成根节点

        printf("请输入%c的左孩子:",ch);        //给出输入提示!!!!很重要啊!!

        BinTreeCreat(BT->lchild);              //构造左子树

        printf("请输入%c的右孩子:",ch);

        BinTreeCreat(BT->rchild);              //构造右子树

    }

    else

        BT=NULL;//这一句很重要!!!指针不指向有效地址就让它指向空!

}

 

 

void PreOrderBinTraverse(BitNode *BT)              //构建先序遍历

{

  if(NULL!=BT)                                     //为了防止把NULL赋值给BT

  {

    printf("%c ",BT->data);

    PreOrderBinTraverse(BT->lchild);

PreOrderBinTraverse(BT->rchild);

  }

}

 

void PreOrderBinTraverse2(BitNode *BT)             //利用栈来弹出输出数据

{

    BitNode *p;

    Stack s;

        s.top=-1;

    if(NULL==BT)

    {

         return;

    }

    else

    {

        s.top++;

           s.a[s.top]=BT;

        while(s.top!=-1)

        {

         p=s.a[s.top];

         s.top--;

         printf("%c ",p->data);                  //这里是弹出什么 ? 是怎么入栈出栈的?

               if(p->rchild!=NULL)

         {

            s.top++;

         s.a[s.top]=p->rchild;

         }

         if(p->lchild!=NULL)

         {

           s.top++;

        s.a[s.top]=p->lchild;

         }

        }

    }

}

 

void InOrderBinTraverse(BitNode *BT)                //中序遍历

{

    if (NULL!=BT)

    {

        InOrderBinTraverse(BT->lchild);

        printf("%c ",BT->data);

        InOrderBinTraverse(BT->rchild);

    }

}

 

 

void InOrderBinTraverse2(BitNode *BT)

{

      BitNode *p=NULL,*q=NULL;

      Stack s;

      s.top=-1;

      if(NULL==BT)

      {

          return;

      }

      else

      {

          while(BT!=NULL)

          {

              s.top++;

              s.a[s.top]=BT;

              BT=BT->lchild;                  //指向最左下方            

          }

 

          do

          {

              p=s.a[s.top];

              s.top--;

              printf("%c ",p->data);              //弹出最左下方的

              while(p->rchild!=NULL)              //第一次是判断,最左下方的右子树

              {

                  s.top++;

                  s.a[s.top]=p->rchild;

                  q=p->rchild;

                  while(q->lchild!=NULL)

                  {

                      s.top++;

                      s.a[s.top]=q->lchild;

                      q=q->lchild;

                  }

                  break;

              }

          }while(s.top>-1);

      }

}

 

 

void PostOrderBinTraverse(BitNode *BT)                  //后序遍历

{

    if(BT!=NULL)

{

  PostOrderBinTraverse(BT->lchild);

        PostOrderBinTraverse(BT->rchild);

  printf("%c ",BT->data);

}

}

 

 

void PostOrderBinTraverse2(BitNode *BT)   

{

    Stack s;

    s.top=-1;

    BitNode *t;

    int flag;

    do

    {

        while (BT!=NULL)

        {

            s.top++;

            s.a[s.top]=BT;

            BT=BT->lchild;

        }

        t=NULL;

        flag=1;

        while (s.top!=-1 && flag)

        {

            BT=s.a[s.top];

            if (BT->rchild==t)           //t:表示为null,或者右子节点被访问过了。

            {

                printf("%c ",BT->data);

                s.top--;

                t=BT;                    //t记录下刚刚访问的节点

            }

            else

            {

                BT=BT->rchild;

                flag=0;

            }

        }

    } while (s.top!=-1);

}

 

int Height(BitNode *BT)             //求高度

{

    int depth1,depth2;

    if (NULL==BT)

    {

        return 0;

    }

    else

    {

        depth1=Height(BT->lchild);

        depth2=Height(BT->rchild);

        if (depth1>depth2)

        {

            return (depth1+1);

        }

        else

        {

            return (depth2+1);

        }

    }

}

 

 

int main()

{

    BitNode *btr;

    printf("请输入根节点:");

    BinTreeCreat(btr);

    printf("前序遍历:递归和非递归实现:\n");

    PreOrderBinTraverse(btr);

    printf("\n");

    PreOrderBinTraverse2(btr);

    printf("\n");

    printf("中序遍历:递归和非递归实现:\n");

    InOrderBinTraverse(btr);

    printf("\n");

    InOrderBinTraverse2(btr);

    printf("\n");

    printf("后序遍历:递归和非递归实现:\n");

    PostOrderBinTraverse(btr);

    printf("\n");

    PostOrderBinTraverse2(btr);

    printf("\n");

    printf("二叉树的高度:\n");

    int Hgt=Height(btr);

    printf("%d \n",Hgt);

    printf("\n");

    return 0;

}

这是可以完全实现的代码,  如果有心思看的人, 可以对照一下。
2013-06-02 16:48
快速回复:C语言二叉树的遍历问题,照着他人的代码练习的,实在是自己找不出错误 ...
数据加载中...
 
   



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

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