题目:
按要求二叉树按二叉链表形式存储,
1、写一个建立二叉树的算法;2、写一个判别给定的二叉树是否是完全二叉树的算法
分析:判断是否是完全二叉树的方法:若某结点无左子女就不应有右子女
建立二叉树【递归实现】
typedef struct node{
int data; //data域;
struct node *lchild; //左孩子
struct node *rchild; //右孩子
}BiNode, * BiTree;
BiTree Creat(){ //建立二叉树的二叉链表形式的存储结构
ElemType x;BiTree bt;
scanf("%d",&x); //传入根结点
if( x==0 ) bt=NULL;
else {
bt=(BiNode *)malloc(sizeof(BiNode));
bt->data = x;
printf("请输入%d的左孩子",x);
bt->lchild=Creat(); //递归建立左子树
printf("请输入%d的右孩子",x);
bt->rchild=Creat(); //递归建立左子树
}
return(bt);
}
判断是否为完全二叉树
int JudgeComplete(BiTree bt){ //判断二叉树是否是完全二叉树,若是,返回1,否则返回0
int tag=0;
BiTree p=bt,Q[]; //Q是队列,元素是二叉树结点指针,容量足够大
if(p==NULL) return(1);
Queuelnit(Q);QueucIn(Q,p); //初始化队列,根结点指针入队
while(!QueueEmpty(Q)){
p=QueueOut(Q); //出队
if(p->lchild && !tag) QueueIn(Q,p->lchild); //左子女入队
else{
if(p->lchild) return 0; //前边已有结点为空,本结点不空
else tag=1; //首次出现结点为空
}
if(p->rchild && !tag) QueueIn(Q,p->rchild); //右子女入队
else{
if(p->rchild) return 0; //前边已有结点为空,本结点不空
else tag=1; //首次出现结点为空
}
}
return 1;
}
其他辅助函数
//以括号表示法输出二叉树
void DispBTree(BiTree b){
if(b!=NULL){
printf("%d",b->data);
if(b->lchild != NULL || b->rchild != NULL){
printf("("); //有孩子结点时才输出(
DispBTree(b->lchild); //递归处理左子树
if(b->rchild != NULL)
printf(","); //有右孩子结点时才输出,
DispBTree(b->rchild); // 递归处理右子树
printf(")"); //有孩子结点时才输出)
}
}
}
//销毁二叉树
void DestroyBTree(BiTree &b){ //传入根结点
if(b!=NULL){
DestroyBTree(b->lchild); //递归删除左孩子
DestroyBTree(b->rchild);
free(b);
}
}
int main(){
BiTree bt;
bt=Creat();
DispBTree(bt);
DestroyBTree(bt);
return 1;
}
运行结果: