题目
二叉树采用链表存储
1、计算二叉树的高度
2、计算二叉树的最大宽度(二叉树最大宽度指的是二叉树所有层中结点个数最大的值)
代码
#include <iostream>
using namespace std;
#define MAXSIZE 50
typedef char ElemType;
//定义二叉树
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//定义队列
typedef struct SqQueue{
struct BiTNode *data[MAXSIZE];
int front,rear;
}SqQueue;
//初始化队列
void InitQueue(SqQueue &Q){
Q.rear=Q.front=0;
}
//入队
bool EnQueue(SqQueue &Q,BiTNode *e){
if((Q.rear+1)%MAXSIZE==Q.front)
return false; //队满
Q.data[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return true;
}
//出队
bool DeQueue(SqQueue &Q,BiTNode *&x){
if(Q.rear==Q.front)
return false; //队空
x=Q.data[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return true;
}
//判队空
bool isEmpty(SqQueue Q){
if(Q.rear==Q.front)
return true;
else
return false;
}
//先序遍历创建二叉树
void createBiTree(BiTree &T){
ElemType ch=getchar();
if(ch=='#')
T=NULL;
else{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
//先序遍历输出二叉树
void PreOrder(BiTree T){
if(T==NULL)
return;
else{
cout<<T->data<<" ";
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//求深度
int getDepth(BiTree T){
int dep1,dep2;
if(T==NULL)
return 0;
else{
dep1=getDepth(T->lchild);
dep2=getDepth(T->rchild);
return dep1>dep2? 1+dep1:1+dep2;
}
}
//求宽度
int getWidth(BiTree T){
SqQueue Q;
InitQueue(Q);
int oldNum=0;//每次遍历一层还剩余的结点数,表示正在循环的层次结点数
int curNum=0;//当树的一层入队完成后保存的结点数,表示下一层的结点数,同时也表示该层的宽度
int width; //保留最大宽度
BiTree x;
BiTree p=T;
if(p){
EnQueue(Q,p);//第一层根结点入队
oldNum++;
width=1;
while(!isEmpty(Q)){
while(oldNum--){ //当正在循环的层的结点
DeQueue(Q,x); //首元素出队
if(x->lchild){
EnQueue(Q,x->lchild);
curNum++; //当前队列元素加一
}
if(x->rchild){
EnQueue(Q,x->rchild);
curNum++;
}
}
if(curNum>width){
width=curNum;
} //如果当前队列元素大于之前的,则更新宽度
oldNum=curNum;
curNum=0;
}
}
return width;
}
int main() {
//ABD##EH###CF##G##
//视频链接【求二叉树宽度-哔哩哔哩】 https://b23.tv/WgRqtJH
BiTree T;
createBiTree(T);
PreOrder(T);
cout<<endl;
cout<<"二叉树高度为:"<<getDepth(T)<<endl;
cout<<"二叉树的宽度为:"<<getWidth(T)<<endl;
return 0;
}