当前位置:嗨网首页>书籍在线阅读

14-计算二叉树的高度和最大宽度

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

7.3.4 计算二叉树的高度和最大宽度

问题描述

19.png 二叉树采用二叉链表存储。

(1)编写计算二叉树高度的算法。

(2)编写计算二叉树最大宽度的算法。二叉树的最大宽度是指二叉树所有层中节点个数的最大值。

【分析】

这是西北大学考研试题。

二叉树的高度递归定义如下。

210.png 当二叉树已空时,其高度为0。当二叉树只有根节点(即节点的左、右子树均已空)时,二叉树的深度为1。其他情况下,二叉树的左、右子树高度的最大值再加1(根节点)就是二叉树的高度。

求二叉树的最大宽度可通过层次遍历二叉树实现。具体思路为依次将每一层中节点的指针入队,然后再分别将当前层的指针出队,统计其节点个数,并将下一层节点的指针入队,记录每一层节点个数,得出节点个数最大值。遍历完毕后,节点个数最大值就是二叉树的最大宽度。

第7章\实例7-10.cpp
/********************************************
*实例说明:求二叉树的高度和最大宽度
*********************************************/
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include<iostream.h>
#define MAXSIZE 100
typedef struct Node
{
    char data;
    struct Node    * lchild,*rchild;
}BitNode,*BiTree;
void CreateBitTree(BiTree *T,char str[]);
void PrintLevel(BiTree T);
void CreateBitTree(BiTree *T,char str[])
/*利用括号嵌套法创建二叉链表*/
{
    char ch;
    BiTree stack[MAXSIZE];      /*定义栈,用于存放指向二叉树中节点的指针*/
    int top=-1;                 /*初始化栈顶指针*/
    int flag,k;
    BitNode *p;
    *T=NULL,k=0;
    ch=str[k];
    while(ch!='\0')             /*如果字符串没有结束*/
    {
        switch(ch)
        {
            case '(':
                stack[++top]=p;
                flag=1;
                break;
            case ')':
                top--;
                break;
            case ',':
                flag=2;
                break;
            default:
                p=(BiTree)malloc(sizeof(BitNode));
                p->data=ch;
                p->lchild=NULL;
                p->rchild=NULL;
                if(*T==NULL)/*如果节点是第一个节点,表示它为根节点*/
                    *T=p;
                else
                {
                    switch(flag)
                    {
                        case 1:
                            stack[top]->lchild=p;
                            break;
                        case 2:
                            stack[top]->rchild=p;
                            break;
                    }
                }
        }
        ch=str[++k];
    }
}
void TreePrint(BiTree T,int level)
/*按树状输出的二叉树*/
{
    int i;
    if(T==NULL)                    
        return;
    TreePrint(T->rchild,level+1);  
    for(i=0;i<level;i++)           
        printf("   ");
    printf("%c\n",T->data);       
    TreePrint(T->lchild,level+1);  
}
int BiTreeDepth(BiTree T)
/*计算二叉树的高度*/
{
    if(T == NULL)
        return 0;
    return  BiTreeDepth(T->lchild)>BiTreeDepth(T->rchild)?
            1+BiTreeDepth(T->lchild):1+BiTreeDepth(T->rchild);
}
int BiTreeWidth(BiTree T)
//计算二叉树的最大宽度
{
    int front,rear,last,maxw,temp;
    BiTree Q[MAXSIZE];         //Q是队列,元素为二叉树节点的指针
    BitNode *p;
    if (T==NULL)               //空二叉树最大宽度为0
        return 0;
    else
    {
        front=1;rear=1;last=1;  
        temp=0;                
        maxw=0;                
        Q[rear]=T;             
        while(front<=last)
        {
            p=Q[front++];
            temp++;                      //同层节点数加1
            if (p->lchild!=NULL)
                Q[++rear]=p->lchild;     //左子节点入队
            if (p->rchild!=NULL)
                Q[++rear]=p->rchild;     //右子节点入队
            if (front>last)              //一层结束
            {
                last=rear;
                if(temp>maxw)
                    maxw=temp;           //last指向下层最右节点, 更新当前最大宽度
                temp=0;
            }
        }
        return maxw;
    }
}
void main()
{
    BiTree T;
    char str[MAXSIZE];
    cout<<"请输入二叉树的广义表形式:"<<endl;
    cin>>str;
    cout<<"由广义表形式的字符串构造二叉树:"<<endl;
    CreateBitTree(&T,str);
    TreePrint(T,1);
    cout<<"这棵二叉树的高度为"<<BiTreeDepth(T)<<endl;
    cout<<"这棵二叉树的最大宽度为"<<BiTreeWidth(T)<<endl;
}

运行结果如图7.31所示。

211.png

图7.31 运行结果