假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树的宽度(即具有结点数最多的那一层的结点个数)

求二叉树的宽度有两种方法:

  1. 用一个指针记录下每层的最右边的结点,当工作指针的值与该指针一致时,说明一层遍历完毕,这样只需记录下每层的结点数,取最大值即可;

  2. 记录下每个结点所处于的层数,之后只需对层树相同的结点个数进行计数,取其最大值即可

第一种:

int width1(BiTree bt)
{
   //用第一种方法编写如下算法
    if(bt == NULL)
        return 0;
    else
    {
   
        Queue qu;   qu.front = qu.rear = -1;
        BiTree p;                      //工作指针
        BiTree lastnode = bt;          //用于指向每层最后一个结点
        BiTree newnode = NULL;         //用于查找下一层的最后一个结点
        int max = 1;    int count = 0;  //用于记录每层的结点个数
        qu.data[++qu.rear] = bt;
        while(qu.front != qu.rear)
        {
   
            p = qu.data[++qu.front];
            if(p->lchild != NULL)
            {
   
                qu.data[++qu.rear] = p->lchild;
                newnode = p->lchild;
                count++;
            }
            if(p->rchild != NULL)
            {
   
                qu.data[++qu.rear] = p->rchild;
                newnode = p->rchild;
                count++;
            }
            if(p == lastnode)
            {
   
                lastnode = newnode;
                if(count>max)
                    max = count;
                count = 0;  //不管count有没有大于max,扫描完一层后都要归零
            }
        }
        return max;
    }
}

第二种:

int width2(BiTree bt, int* depth)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值