第4章第1节练习题10 判断某二叉树是否为完全二叉树
2016-08-19 08:07
369 查看
问题描述
试写一算法,完成判定某二叉树是否为完全二叉树的功能算法思想
根据完全二叉树的定义,具有n个节点的完全二叉树与满二叉树中的编号从1~n的节点一一对应,可以考虑使用层次遍历的思想来实现。将所有节点入队(包括空节点)。当遇到空节点时,查看其后是否还有不为空的节点:如果没有,则为完全二叉树;如果有,则不是完全二叉树;
算法描述
int IsComplete(BiTNode* T){ SqQueue Q; InitQueue(&Q); BiTNode *p=T; EnQueue(&Q,p); while(IsEmptyQueue(&Q)!=0){ p=DeQueue(&Q); if(p!=NULL){ EnQueue(&Q,p->lchild); EnQueue(&Q,p->rchild); }else{ while(IsEmptyQueue(&Q)!=0){ p=DeQueue(&Q); if(p!=NULL){ return -1; } } } } return 0; }
具体代码见附件。
附件
//AB#DF###C#E##
//ABD##E##CF###
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef char ElemType;
/*-----------------------------------------*/
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTNode* CreateBiTree(BiTNode*);
int IsComplete(BiTNode*);
/*-----------------------------------------*/
typedef struct SqQueue{
BiTNode* data[MaxSize];
int front, rear;
}SqQueue;
void InitQueue(SqQueue*);
void EnQueue(SqQueue*, BiTNode*);
BiTNode* DeQueue(SqQueue*);
int IsEmptyQueue(SqQueue*);
/*-----------------------------------------*/
int main(int argc, char* argv[]){
BiTNode *T=(BiTNode*)malloc(sizeof(BiTNode));
T=CreateBiTree(T);
int flag=IsComplete(T);
if(flag==0){
printf("Commplete Bitreee!\n");
}else{
printf("No complete Bitree!\n");
}
return 0;
}
/*-----------------------------------------*/
//创建二叉树
BiTree CreateBiTree(BiTNode* T){
ElemType x;
scanf("%c",&x);
if(x=='#'){
return T;
}else{
T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=x;
T->lchild=CreateBiTree(T->lchild);
T->rchild=CreateBiTree(T->rchild);
}
return T;
}
int IsComplete(BiTNode* T){ SqQueue Q; InitQueue(&Q); BiTNode *p=T; EnQueue(&Q,p); while(IsEmptyQueue(&Q)!=0){ p=DeQueue(&Q); if(p!=NULL){ EnQueue(&Q,p->lchild); EnQueue(&Q,p->rchild); }else{ while(IsEmptyQueue(&Q)!=0){ p=DeQueue(&Q); if(p!=NULL){ return -1; } } } } return 0; }
/*-----------------------------------------*/
void InitQueue(SqQueue* Q){
Q->front=0;
Q->rear=0;
}
void EnQueue(SqQueue* Q, BiTNode* T){
if((Q->rear+1)%MaxSize==Q->front){
return;
}
Q->data[Q->rear++]=T;
}
BiTNode* DeQueue(SqQueue* Q){
if(Q->front==Q->rear){
return NULL;
}
return Q->data[Q->front++];
}
int IsEmptyQueue(SqQueue* Q){
if(Q->front==Q->rear){
return 0;
}
return -1;
}
相关文章推荐
- 第4章第1节练习题15 判断两颗二叉树是否相似
- 二叉树问题---判断一棵树是否为完全二叉树
- 第2章第1节练习题2 判断是否中心对称
- 判断一棵二叉树是否为完全二叉树
- 判断一颗二叉树是否是完全二叉树
- 二叉树面试题-镜像与判断是否为完全二叉树
- 第4章第1节练习题13 根据先序序列和中序序列建立二叉树
- 判断一颗二叉树是否是完全二叉树
- (判断二叉树是完全二叉树)L3-010. 是否完全二叉搜索树
- 【二叉树】层次遍历二叉树以及判断一棵树是否是完全二叉树
- 判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先——题集(十三)
- 二叉树的链式存储结构 前序 后序 中序 层序遍历操作实现 判断是否完全二叉树
- 判断二叉树是否平衡、是否完全二叉树、是否二叉排序树
- 如何判断二叉树是否为完全二叉树?
- 判断一棵二叉树是否是完全二叉树
- 二叉树面试题:判断树是否为完全二叉树和求二叉树的镜像
- 二叉树采用二叉链表存储,设计算法判断给定的二叉树是否是一棵完全二叉树,采用先进先出的队列。
- 二叉树系列问题——判断一棵树是否为完全二叉树
- 刷题之二叉树----判断一棵树是否为完全二叉树
- 二叉树(二) 求二叉树高度,根据先序和中序构建二叉树,判断二叉树是否是完全二叉树,判断两棵树是否相等