完全二叉树的判断 下面给出两个列子(序号只是为了输入方便,并不代表完全二叉树的编号顺序)其中,列1为非完全二叉树【高度差大于2】,列2为完全二叉树。
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include <iostream>
#define MAXSIZE 10010
#define ElemType int
using namespace std
;
typedef struct BTNode
{
ElemType data
;
BTNode
*lchild
,*rchild
;
}*BTree
;
BTree
CreateTree(){
ElemType ch
;
printf("输入结点元素值:");
scanf("%d",&ch
);
if(ch
== 0)
return NULL;
else{
BTree tree
=(BTree
)malloc(sizeof(BTree
));
tree
->data
=ch
;
printf("%d 结点左子树\n",ch
);
tree
->lchild
=CreateTree();
printf("%d 结点右子树\n",ch
);
tree
->rchild
=CreateTree();
return tree
;
}
}
void LayeredOrderTravel(BTree tree
){
queue
<BTree
> queue1
;
BTree p
;
if(tree
){
queue1
.push(tree
);
while(!queue1
.empty()){
p
=queue1
.front();
queue1
.pop();
printf("%d ",p
->data
);
if(p
->lchild
)
queue1
.push(p
->lchild
);
if(p
->rchild
)
queue1
.push(p
->rchild
);
}
}
}
bool
ISCompleteTree(BTree tree
){
queue
<BTree
> queue1
;
BTree p
;
int flag
=false
;
if(tree
){
queue1
.push(tree
);
while(!queue1
.empty()){
p
=queue1
.front();
queue1
.pop();
if(flag
){
if((p
->lchild
)||(p
->rchild
))
return false
;
}else{
if((p
->rchild
)&&!(p
->lchild
))
return false
;
else if((p
->lchild
)&&!(p
->rchild
)){
queue1
.push(p
->lchild
);
flag
=true
;
}else if((p
->lchild
)&&(p
->rchild
)){
queue1
.push(p
->lchild
);
queue1
.push(p
->rchild
);
}else{
flag
=true
;
}
}
}
}
return true
;
}
int main(){
printf("二叉树的建立\n");
BTree tree
;
tree
=CreateTree();
printf("二叉树的层序遍历\n");
LayeredOrderTravel(tree
);
printf("\n判断是否为完全二叉树\n");
bool flag
=ISCompleteTree(tree
);
if(flag
)
printf("该树为完全二叉树\n");
else
printf("该树为非完全二叉树\n");
return 0;
}
转载请注明原文地址:https://blackberry.8miu.com/read-40683.html