用二叉链表存储二叉树,并判断二叉树是否为完全二叉树

题目:

按要求二叉树按二叉链表形式存储,
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; 
} 

运行结果:

用二叉链表存储二叉树,并判断二叉树是否为完全二叉树_第1张图片

 

用二叉链表存储二叉树,并判断二叉树是否为完全二叉树_第2张图片

 

你可能感兴趣的:(数据结构学习笔记,链表,数据结构,算法,二叉树)