| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 338 人关注过本帖
标题:二叉树的层次建立,谁来说下错误原因啊
只看楼主 加入收藏
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
结帖率:58.18%
收藏
已结贴  问题点数:20 回复次数:3 
二叉树的层次建立,谁来说下错误原因啊
这里面的二叉树结点数据为整数,当整数输入为0时表示该结点不存在,输出是中序遍历二叉树。
一开始漏掉了BT->Left = BT->Right = NULL;,T->Left->Left = T->Left->Right = NULL;,T->Right->Left = T->Right->Right = NULL;
可我觉得不加那几个语句也没错啊,谁来说下错误原因。

程序代码:
#include <stdio.h>
#include <stdlib.h>

#define MaxSize 30

typedef struct QueueNode* PtrQType ;
typedef struct BinTreeNode* PtrBT ;

//二叉树结点结构体
struct BinTreeNode
{
    int BTNodeData ;
    struct BinTreeNode* Right;
    struct BinTreeNode* Left ;
} ;

//顺序队列
struct QueueNode
{
    struct BinTreeNode* AddressData[MaxSize] ;//指针数组,数组中保存的是地址
    int rear ;
    int front ;

} ;


//队列的初始化
PtrQType CreateQueue(  )
{
    PtrQType PtrQ ;
    PtrQ=(struct QueueNode*)malloc(sizeof(struct QueueNode));
    PtrQ->front=-1 ;
    PtrQ->rear=-1  ;
    
    return PtrQ ;
}

//入队
void AddQ( PtrQType PtrQ , struct BinTreeNode* a )
{
    int IsFull( PtrQType PtrQ ) ;
    //判断队列是否已满
    if( !IsFull(PtrQ) )//没满添加数据
    {
        (PtrQ->rear)++ ;
        (PtrQ->AddressData[PtrQ->rear]) = a ;
        
    }
    else 
        printf("队列已满,停止入队\n");

}

//出队,并返回队首(树的地址)
PtrBT DeleteQ( PtrQType PtrQ )
{
    int i ;
    if( !IsEmpty(PtrQ) )
    {
        PtrQ->front++ ;
        i=PtrQ->front ;
    
        
        return PtrQ->AddressData[i] ;
    }
    else printf("队列已空\n") ;
}


//队列是否已满
int IsFull( PtrQType PtrQ )
{
    if (PtrQ->rear == MaxSize-1)
        return 1 ;
    else
        return 0 ;
}

//队列已空
int IsEmpty( PtrQType PtrQ )
{
    if( PtrQ->front == PtrQ->rear )
        return 1 ;
    else
        return 0 ;

}



PtrBT CreateBinTree(  )
{
    //函数声明
    PtrQType CreateQueue(  ) ;        //队列初始化
    void AddQ( PtrQType PtrQ , struct BinTreeNode* a ) ;    //入队
    PtrBT DeleteQ( PtrQType PtrQ ) ;   //出队


    int Data ;
    PtrBT BT,T ;
    PtrQType PtrQ ;        


    BT = NULL ;            //树的初始化
    T = NULL ;

    PtrQ = CreateQueue() ;

    scanf("%d",&Data) ;        //读入数根节点数据,数据为0则输出空树
    if( Data )
    {
        BT = ( PtrBT )malloc(sizeof(struct BinTreeNode) ) ;
        BT->BTNodeData = Data ;
         BT->Left = BT->Right = NULL;
        AddQ( PtrQ , BT ) ;
    }
    else return NULL ;

    while( !IsEmpty(PtrQ)  )        //当队列非空时执行...
    {
        T = DeleteQ( PtrQ ) ;    //弹出队首,地址赋给指针T
        scanf("%d",&Data) ;        //读入左儿子结点数据
        if( Data )                //左儿子结点读入数据,并将左儿子结点指针入队
        {
            T->Left = ( PtrBT )malloc(sizeof(struct BinTreeNode) ) ;
            T->Left->BTNodeData = Data ;
            T->Left->Left = T->Left->Right = NULL;
            AddQ( PtrQ , T->Left ) ;
        }
        else T->Left=NULL ;

        T = DeleteQ( PtrQ ) ; 
        scanf("%d",&Data) ;        //读入右儿子结点数据
        if( Data )                //右儿子结点读入数据,并将右儿子结点指针入队
        {
            T->Right = ( PtrBT )malloc(sizeof(struct BinTreeNode) ) ;
            T->Right->BTNodeData = Data ;
            T->Right->Left = T->Right->Right = NULL; 
            AddQ( PtrQ , T->Right ) ;
        }
        else T->Right=NULL ;
    }
    return BT ;             
}




void InOrderTraversal( PtrBT BT  )
{
    if(BT)
    {
        InOrderTraversal(BT->Left);
        printf("%d",BT->BTNodeData);
        InOrderTraversal(BT->Right);

    }
}



int main(    )
{
    PtrBT BT ;
    printf("请输入树(层次建立)\n") ;
    BT = CreateBinTree() ;

    //中序遍历
    InOrderTraversal(BT);


    printf( "层次输出树:\n"  ) ;
//    PrintfBT(  BT ) ;

    
}

图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 二叉树 
2015-11-16 18:18
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:20 
头有点大了诶

剑栈风樯各苦辛,别时冰雪到时春
2015-11-16 18:45
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 2楼 林月儿
代码改写了,是队列建立的有问题,队首队尾不改赋初值0。操作也有错
程序代码:
#include <stdio.h>
#include <stdlib.h>

#define MaxSize 30

typedef struct QueueNode* PtrQType ;
typedef struct BinTreeNode* PtrBTType ;

//二叉树结点结构体
struct BinTreeNode
{
    int BTNodeData ;
    struct BinTreeNode* Right;
    struct BinTreeNode* Left ;
} ;

//顺序队列
struct QueueNode
{
    struct BinTreeNode* AddressData[MaxSize] ;//指针数组,数组中保存的是地址
    int rear ;
    int front ;

} ;

//队列的初始化
PtrQType InitializeQ(  )
{ 
    PtrQType  Q  ;
    Q = (PtrQType)malloc( sizeof(struct QueueNode) );
    Q->rear = -1 ;
    Q->front= 0 ;
    return Q ;

}


//队列是否为空
int IsEmptyQ( PtrQType Q )
{
    if( Q->front > Q->rear )
        return 1 ;
    else
        return 0 ;
}


//队列是否已满
int IsFullQ( PtrQType  Q )
{
    if(Q->rear == MaxSize-1 )
        return 1 ;
    else
        return 0 ;
}


//入队
void AddQ(  PtrQType Q , struct BinTreeNode* T)
{    
    int IsFullQ( PtrQType  Q ) ;//函数声明
    if( !IsFullQ( Q ))
    {
        Q->rear++ ;
        Q->AddressData[Q->rear] = T ;
    }
    else printf("队列已满,停止添加数据\n") ;
}


//出队,并返回队列结点数据(地址)
PtrBTType DeleteQ(  PtrQType Q  )
{
    int IsFullQ( PtrQType  Q ) ;//函数声明
    int i ;
    i = Q->front ;
    if( !IsEmptyQ(Q) )
    {
        Q->front++ ;
        return Q->AddressData[ i ] ;
    }
    else printf("队列已空\n");
}


//层序建立二叉树
PtrBTType CreateBT(   )
{
    void AddQ(  PtrQType Q , struct BinTreeNode* T) ;
    PtrBTType DeleteQ(  PtrQType Q  ) ;
    PtrQType InitializeQ(  ) ;
    int IsEmptyQ( PtrQType Q ) ;
    
    
    int Data ;
    PtrBTType BT , T ;
    PtrQType Q ;

    //初始化队列
     Q = InitializeQ(  ) ;


    //输入根结点数据
    BT = ( PtrBTType )malloc(sizeof(struct BinTreeNode)) ;
//    BT->Left = NULL ;
//    BT->Right = NULL ;

    
    scanf("%d",&BT->BTNodeData ) ;

    if(  BT->BTNodeData )//如果根节点数据不为0,将根节点地址入队,否则返回空树
        AddQ( Q, BT ) ;
    else return NULL ; 

    while( !IsEmptyQ(Q) )//当队列不为空
    {
        //初始化左右儿子结点                    
        T = DeleteQ( Q ) ;
        scanf("%d",&Data) ;//输入左儿子结点数据
        if(Data)
        {
            T->Left = ( PtrBTType )malloc(sizeof(struct BinTreeNode)) ;
            T->Left->BTNodeData = Data ;
            //T->Left->Left = T->Left->Right = NULL ;

            AddQ( Q,T->Left ) ;
        }
        else T->Left = NULL ;
        
        scanf("%d",&Data) ;//输入右儿子结点数据
        if(Data)
        {
            T->Right = ( PtrBTType )malloc(sizeof(struct BinTreeNode)) ;
            T->Right->BTNodeData = Data ;
            //T->Right->Left = T->Right->Right = NULL ;

            AddQ( Q,T->Right ) ;
        }
        else T->Right = NULL ;
    }

    return BT ;

}


void InOrderTraversal( PtrBTType BT )
{
    if(BT)
    {
        InOrderTraversal( BT->Left )  ;
        printf("%d  ",BT->BTNodeData )  ;
        InOrderTraversal( BT->Right ) ;
    }
}



int main()
{
    PtrBTType BT ;
    printf("请输入树(层次建立)\n") ;
    BT = CreateBT() ;

 
     //中序遍历
     InOrderTraversal(BT);     
}
2015-11-16 21:39
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 2楼 林月儿
看我的这篇
https://bbs.bccn.net/thread-459291-1-1.html
2015-11-16 22:40
快速回复:二叉树的层次建立,谁来说下错误原因啊
数据加载中...
 
   



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

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