沉浸020903 2022-11-17 11:14 采纳率: 78.9%
浏览 9
已结题

二叉树的宽度计算,width函数我要怎么改

问题遇到的现象和发生背景

计算二叉树宽度,我的width函数为什么计算的是错的?
输入:cei#j##f#gk##h##d##

用代码块功能插入代码,请勿粘贴截图

# include <stdio.h>
# include <stdlib.h>
# define MAX 100
# define MaxSize 100

//定义数组的长度为100


//二叉树的结点定义
typedef struct node
{
    struct node *lchild, *rchild;
    char data;
}BT,*BiTree;


//循环队列的结点定义
typedef struct
{
    int head;
//head为头
    int rear;
//rear为尾
    BT data[MAX];
//data为二叉树类型的数组,能存放二叉树中的元素
}LinkQueue;

BT* CreateBiTree()
{
    BT* T;
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
        T=NULL;
    else
    {
        T=(BT* )malloc(sizeof(BT));
        if(!T)
            exit(-1);
        (T)->data=ch;
        T->lchild=CreateBiTree();
        T->rchild=CreateBiTree();
    }
    return T;
}



//判断队是否为空
//队不为空则返回1,队空则返回0
int EmptyQueue (LinkQueue* Q)
{
    if (Q->head == Q->rear)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}


//入队
void PushQueue (LinkQueue* Q, BT t)
{
    Q->rear = (Q->rear+1)%MAX;
    Q->data[Q->rear] = t;
}


//出队
void PopQueue (LinkQueue* Q)
{
    Q->head = (Q->head+1)%MAX;
}


//层次遍历二叉树
void Leave (BT* t)
{
    LinkQueue Q;
//定义一个循环队列
    Q.head = 0;
    Q.rear = 0;
//循环队列初始化
//队为空的条件:队头等于队尾
    BT* temp;
//定义一个二叉树类型的指针
    PushQueue (&Q, *t);
//根节点入队
    while (EmptyQueue (&Q))
//当队不为空时,循环
    {
        *temp = Q.data[Q.head+1];
//将队头元素赋值给变量*temp
        printf ("%c", temp->data);
//输出队头元素的值
        PopQueue (&Q);
//队头元素出队
        if (temp->lchild != NULL)
//如果左孩子不为空,则左子树入队
        {
            PushQueue (&Q, *temp->lchild);
        }
//如果右孩子不为空,则右子树入队
        if (temp->rchild != NULL)
        {
            PushQueue (&Q, *temp->rchild);
        }
    }
}

int width(BT* t){
    BT Q[MaxSize];
    BT p;
    int front=1,rear=1,last=1,max=0,temp=0;
    Q[rear]=*t;
    while (front<=last){
        p=Q[front++];
        temp++;
        if(p.lchild!=NULL)
            Q[++rear]=*p.lchild;
        if(p.rchild!=NULL)
            Q[++rear]=*p.rchild;
        if(front>last){
            last=rear;
            if(temp>max)
                max=temp;
            temp=0;
        }
    }
    return max;
}




int main (void)
{
    BT* t;
    t=CreateBiTree();
    Leave (t);
    int w=width(t);
    printf("\n宽度 %d",w);
    return 0;
}

运行结果及报错内容

cei#j##f#gk##h##d##
cedifjgkh
宽度 1

我想要达到的结果

可以计算二叉树的宽度

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2022-11-17 11:47
    关注

    *temp = Q.data[Q.head+1];
    你这temp只是一个 BT * 指针类型,没有分配空间,你这代码咋能运行通过的呢?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月24日
  • 已采纳回答 12月24日
  • 创建了问题 11月17日

悬赏问题

  • ¥15 如何证明高斯噪声的包络公式
  • ¥150 寻找王者荣耀开发作者,合作或者解答
  • ¥15 乳腺癌数据集 相关矩阵 特征选择
  • ¥15 我的游戏账号被盗取,请问我该怎么做
  • ¥15 通关usb3.0.push文件,导致usb频繁断连
  • ¥15 有没有能解决微信公众号,只能实时拍照,没有选择相册上传功能,我不懂任何技术,,有没有给我发个软件就能搞定的方法
  • ¥15 Pythontxt文本可视化
  • ¥15 如何基于Ryu环境下使用scapy包进行数据包构造
  • ¥15 springboot国际化
  • ¥15 搭建QEMU环境运行OP-TEE出现错误