题目来源:严蔚敏《数据结构》C语言版本习题册 6.49
// 6.49 编写算法判别给定二叉树是否为完全二叉树int BiTreeIsComplete(BiTree root) {// 判断二叉树是否是完全二叉树// 思路:完全二叉树的层次遍历应没有NULL 或者说 在完全二叉树包括空指针的层次遍历中NULL在最后面// 操作:对完全二叉树进行层次遍历(包括空指针)。若遍历途中出现空指针,则标记为flag=1。在遍历途中如果是非空结点,而且flag=0,则不是二叉树BiTNode *que[MAXSIZE]; int front,rear; //定义一个队列BiTree p;int flag=0; //标识前面是否出现过空指针if (root==NULL) return 1; //临界条件不要丢:空树也是完全二叉树front=rear=0;que[rear]=root; rear=(rear+1)%MAXSIZE; //根指针入队列while (front!=rear) {p=que[front]; front=(front+1)%MAXSIZE; //出队列if (p==NULL) { //此指针是空指针flag=1; //标记出现过空指针} else { //此指针是非空结点if (flag) return 0; //之前出现过空指针,不是完全二叉树// 不判断p的孩子是否为空指针,直接队列que[rear]=p->lchild; rear=(rear+1)%MAXSIZE;que[rear]=p->rchild; rear=(rear+1)%MAXSIZE;}}return 1;}int BiTreeIsFull(BiTree root) {// 判断二叉树是否是满二叉树// 思路:首先它是完全二叉树,并且结点总数sum=2^n-1// 操作:在判断完全二叉树的途中记录结点个数,然后判断sum=2^n-1是否满足/* 补充知识:判断数num是否是2^k --> !( num&(num-1) )[理解] 若num是2的k次方,那么它二进制只有一位是1-->举例0100。那num-1=0011。0100&0011=0000*/BiTNode *que[MAXSIZE]; int front,rear;BiTree p;int flag=0; //标记之前是否出现了空指针int sum=0; //结点总数front=rear=0;que[rear]=root; rear=(rear+1)%MAXSIZE;++sum;while (front!=rear) {p=que[front]; front=(front+1)%MAXSIZE;if (p==NULL) flag=1; //出现了空指针else {if (flag) return 0;++sum;que[rear]=p->lchild; rear=(rear+1)%MAXISZE;que[rear]=p->rchild; rear=(rear+1)%MAXISZE;}}// 检查sum=2^n-1 --> sum+1是2的n次方sum = sum+1;if ( !( sum&(sum-1) ) ) return 1; //检查数num是否为2的k次方else return 0;}
