高冷罗少L 2024-05-29 18:58 采纳率: 100%
浏览 12
已结题

有关数据结构二叉树的问题

基于二叉链表的二叉树的遍历
描述:
设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法分别实现二叉树的先序、中序和后序遍历。
输入:
多组数据。每组数据一行,为二叉树的前序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。
输出:
每组数据输出三行,为二叉树的先序、中序和后序序列。

img

我的代码如下:


#include <stdio.h>
#include <stdlib.h>
//#include <iostream>
//using namespace std;

//二叉树的二叉链表存储表示 
typedef struct BiTNode
{
    char data;                            //节点数据域
    struct BiTNode *lchild, *rchild;     //左右孩子指针 
}BiTNode, *BiTree;

//按先序遍历的顺序建立二叉链表 
void CreateBiTree(BiTree &T)
{
    char ch;
//    cin>>ch;
    scanf("%c", &ch);
    if(ch == '0')                        //递归结束,建空树 
        T = NULL;                        //递归创建二叉树 
    else
    {
        T = new BiTNode;                //生成根节点 
        T->data = ch;                    //根节点数据域置为ch 
        CreateBiTree(T->lchild);        //递归创建左子树
        CreateBiTree(T->rchild);        //递归创建右子树 
    }
} 

//先序遍历
void PreOrderTraverse(BiTree T)
{
    if(T)                                //若二叉树非空 
    {
//        cout<<T->data;                    //访问根节点
        printf("%c",T->data);
        PreOrderTraverse(T->lchild);    //先序遍历左子树
        PreOrderTraverse(T->rchild);    //先序遍历右子树 
    }    
} 

//中序遍历
void InOrderTraverse(BiTree T)
{
    if(T)                                //若二叉树非空 
    {
        InOrderTraverse(T->lchild);        //中序遍历左子树
//        cout<<T->data;                    //访问根节点
        printf("%c",T->data);
        InOrderTraverse(T->rchild);        //中序遍历右子树 
    }    
} 

//后序遍历
void PostOrderTraverse(BiTree T)
{
    if(T)                                //若二叉树非空 
    {
        PostOrderTraverse(T->lchild);    //后序遍历左子树
        PostOrderTraverse(T->rchild);    //后序遍历右子树 
        //cout<<T->data;                    //访问根节点
        printf("%c",T->data);
    }    
} 

int main()
{
    BiTree t;
    CreateBiTree(t);
    
    if(t == NULL)
        printf("\n");
//        cout<<endl;
//    t == NULL;
        
    PreOrderTraverse(t);
    printf("\n");
    InOrderTraverse(t);
    printf("\n");
    PostOrderTraverse(t);
    
    return 0;
}

报错信息如下:

img

找不到哪里错了,请高人指点!谢谢!

  • 写回答

3条回答 默认 最新

  • qzjhjxj 2024-05-30 17:35
    关注

    错误原因为你的编译器版本不支持引用'&',修改如下,改动处见注释,供参考:

    #include <stdio.h>
    #include <stdlib.h>
    //#include <iostream>
    //using namespace std;
    
    //二叉树的二叉链表存储表示 
    typedef struct BiTNode
    {
        char data;                            //节点数据域
        struct BiTNode* lchild, * rchild;     //左右孩子指针 
    }BiTNode, * BiTree;
    
    //按先序遍历的顺序建立二叉链表 
    void CreateBiTree(BiTree* T) //  void CreateBiTree(BiTree& T) 修改
    {
        char ch;
        //    cin>>ch;
        scanf(" %c", &ch);  //scanf("%c", &ch); 修改
        if (ch == '0')  
            *T = NULL; //修改 T = NULL;
        else
        {
            (*T) = new BiTNode;  // 修改  T = new BiTNode; 
            (*T)->data = ch;     // 修改  T->data = ch; 
            CreateBiTree(&(*T)->lchild); // 修改  CreateBiTree(T->lchild); 
            CreateBiTree(&(*T)->rchild); // 修改  CreateBiTree(T->rchild); 
        }
    }
    
    //先序遍历
    void PreOrderTraverse(BiTree T)
    {
        if (T)                                //若二叉树非空 
        {
            // cout<<T->data;                //访问根节点
            printf("%c", T->data);
            PreOrderTraverse(T->lchild);    //先序遍历左子树
            PreOrderTraverse(T->rchild);    //先序遍历右子树 
        }
    }
    
    //中序遍历
    void InOrderTraverse(BiTree T)
    {
        if (T)                                //若二叉树非空 
        {
            InOrderTraverse(T->lchild);        //中序遍历左子树
    //        cout<<T->data;                    //访问根节点
            printf("%c", T->data);
            InOrderTraverse(T->rchild);        //中序遍历右子树 
        }
    }
    
    //后序遍历
    void PostOrderTraverse(BiTree T)
    {
        if (T)                                //若二叉树非空 
        {
            PostOrderTraverse(T->lchild);    //后序遍历左子树
            PostOrderTraverse(T->rchild);    //后序遍历右子树 
            //cout<<T->data;                    //访问根节点
            printf("%c", T->data);
        }
    }
    
    int main()
    {
        while (1) {           // 修改
            BiTree t = NULL;
            CreateBiTree(&t); // 修改
            if (t == NULL)
                break;  //printf("\n"); // 修改
            PreOrderTraverse(t);
            printf("\n");
            InOrderTraverse(t);
            printf("\n");
            PostOrderTraverse(t);
            printf("\n"); // 修改
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月12日
  • 已采纳回答 6月4日
  • 创建了问题 5月29日