判断是否为完全二叉树
利用层次遍历思想,但结点是否为空不影响入队。当出队时,该结点为空,若队列中仍有不为空的结点,则不是完全二叉树
空树也是完全二叉树
#include <stdio.h> #include <stdlib.h> #define MaxSize 100 typedef struct Node{ int data; struct Node *lchild,*rchild; }TreeNode,*Tree; typedef struct{ TreeNode* data[MaxSize]; int front,rear; }Queue; void InitQueue(Queue &Q) { Q.front=Q.rear=0; } bool isEmpty(Queue Q) { if(Q.front==Q.rear) return true; return false; } bool isFull(Queue Q) { if((Q.rear+1)%MaxSize==Q.front) return true; return false; } bool EnQueue(Queue &Q,TreeNode* p) { if(isFull(Q)) return false; Q.data[Q.rear]=p; Q.rear=(Q.rear+1)%MaxSize; return true; } bool DeQueue(Queue &Q,TreeNode* &p) { if(isEmpty(Q)) return false; p=Q.data[Q.front]; Q.front=(Q.front+1)%MaxSize; return true; } void CreateTree(Tree &T) { int x; scanf("%d",&x); if(x==-1) { T=NULL; return; } else { T=(Tree)malloc(sizeof(TreeNode)); T->data=x; printf("输入%d的左结点:",x); CreateTree(T->lchild); printf("输入%d的右结点:",x); CreateTree(T->rchild); } } bool IsComplete(Tree T) { if(T==NULL) //空树是完全二叉树 return true; Queue Q; InitQueue(Q); TreeNode* p=T; EnQueue(Q,p); while(!isEmpty(Q)) { DeQueue(Q,p); if(p) { EnQueue(Q,p->lchild); EnQueue(Q,p->rchild); } else { while(!isEmpty(Q)) { DeQueue(Q,p); if(p) return false; } } } return true; } void LevelOrderTree(Tree T) { if(T==NULL) return; Queue Q; InitQueue(Q); TreeNode* p=T; EnQueue(Q,p); while(!isEmpty(Q)) { DeQueue(Q,p); printf("%d ",p->data); if(p->lchild!=NULL) EnQueue(Q,p->lchild); if(p->rchild!=NULL) EnQueue(Q,p->rchild); } } void MidOrderTree(Tree T) { if(T==NULL) return; else { MidOrderTree(T->lchild); printf("%d ",T->data); MidOrderTree(T->rchild); } } int main() { Tree T; CreateTree(T); LevelOrderTree(T); printf("\n"); MidOrderTree(T); if(IsComplete(T)) printf("\n是完全二叉树"); else printf("\n不是完全二叉树"); return 0; }