二叉树的宽度
由于需要对队列中的不同结点加以区分,自定义一个数组模拟队列
//二叉树结构体定义
typedef struct BiTNode{
ElemType data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode,*BiTree;
//二叉树的宽度
int calculateWidth(BiTree T){
if(!T)
return 0;
BiTree p,Q[MaxSize];
int front=0,rear=0,right=0;
int width=1;
Q[rear++]=T;
while(front!=rear){
p=Q[front++];
if(p->lchild)
Q[rear++]=p->lchild;
if(p->rchild)
Q[rear++]=p->rchild;
if(right<front){
right=rear-1;
width=rear-front>width?rear-front:width;
}
}
return width;
}
二叉树每层的平均值
//二叉树每层的平均值
void Average(BiTree T){
if(!T)
return;
BiTree p,Q[MaxSize];
int front=0,rear=0,right=0;
int sum=0,count=0;
Q[rear++]=T;
while(front!=rear){
p=Q[front++];
sum+=p->data;
count++;
if(p->lchild)
Q[rear++]=p->lchild;
if(p->rchild)
Q[rear++]=p->rchild;
if(right<front){
right=rear-1;
cout<<sum/(count*1.0)<<endl;
sum=0;
count=0;
}
}
}
二叉树的度为0、1、2的结点个数
遍历每个结点即可得到,使用C库中的队列
//二叉树的度为0、1、2的结点个数
void countDegree(BiTree T,int &zero,int &one,int &two){
zero=0;one=0;two=0;
if(!T)
return;
queue<BiTree> Q;
BiTree p;
Q.push(T);
while(!Q.empty()){
p=Q.front();
Q.pop();
if(!p->lchild&&!p->rchild)
zero++;
else if(!p->lchild||!p->rchild)
one++;
else
two++;
if(p->lchild)
Q.push(p->lchild);
if(p->rchild)
Q.push(p->rchild);
}
}
判断二叉树是否是完全二叉树
算法思想
判断层次遍历第一个度非2的结点及其后续的结点
若第一个度非2的结点左子树不存在而右子树存在,则不是完全二叉树
否则,判断其后续的结点
若其后续的结点存在子树,则不是完全二叉树
//判断二叉树是否是完全二叉树
bool isCompleteBiTree(BiTree T){
if(!T)
return true; //空树也是完全二叉树
BiTree p,Q[MaxSize];
int front=0,rear=0;
Q[rear++]=T;
while(front!=rear){
p=Q[front++];
if(!p->lchild&&!p->rchild) //左右孩子均不存在
break;
else if(p->lchild&&!p->rchild){//左孩子存在,右孩子不存在
Q[rear++]=p->lchild;
break;
}
else if(!p->lchild&&p->rchild)//左孩子不存在,右孩子存在
return false;
else{ //左右孩子均存在
Q[rear++]=p->lchild;
Q[rear++]=p->rchild;
}
}
while(front!=rear){ //判断第一个度非2结点的后续结点
p=Q[front++];
if(p->lchild||p->rchild)
return false;
}
return true;
}