题目来源:严蔚敏《数据结构》C语言版本习题册 6.49

    1. // 6.49 编写算法判别给定二叉树是否为完全二叉树
    2. int BiTreeIsComplete(BiTree root) {// 判断二叉树是否是完全二叉树
    3. // 思路:完全二叉树的层次遍历应没有NULL 或者说 在完全二叉树包括空指针的层次遍历中NULL在最后面
    4. // 操作:对完全二叉树进行层次遍历(包括空指针)。若遍历途中出现空指针,则标记为flag=1。在遍历途中如果是非空结点,而且flag=0,则不是二叉树
    5. BiTNode *que[MAXSIZE]; int front,rear; //定义一个队列
    6. BiTree p;
    7. int flag=0; //标识前面是否出现过空指针
    8. if (root==NULL) return 1; //临界条件不要丢:空树也是完全二叉树
    9. front=rear=0;
    10. que[rear]=root; rear=(rear+1)%MAXSIZE; //根指针入队列
    11. while (front!=rear) {
    12. p=que[front]; front=(front+1)%MAXSIZE; //出队列
    13. if (p==NULL) { //此指针是空指针
    14. flag=1; //标记出现过空指针
    15. } else { //此指针是非空结点
    16. if (flag) return 0; //之前出现过空指针,不是完全二叉树
    17. // 不判断p的孩子是否为空指针,直接队列
    18. que[rear]=p->lchild; rear=(rear+1)%MAXSIZE;
    19. que[rear]=p->rchild; rear=(rear+1)%MAXSIZE;
    20. }
    21. }
    22. return 1;
    23. }
    24. int BiTreeIsFull(BiTree root) {// 判断二叉树是否是满二叉树
    25. // 思路:首先它是完全二叉树,并且结点总数sum=2^n-1
    26. // 操作:在判断完全二叉树的途中记录结点个数,然后判断sum=2^n-1是否满足
    27. /* 补充知识:判断数num是否是2^k --> !( num&(num-1) )
    28. [理解] 若num是2的k次方,那么它二进制只有一位是1-->举例0100。那num-1=0011。0100&0011=0000
    29. */
    30. BiTNode *que[MAXSIZE]; int front,rear;
    31. BiTree p;
    32. int flag=0; //标记之前是否出现了空指针
    33. int sum=0; //结点总数
    34. front=rear=0;
    35. que[rear]=root; rear=(rear+1)%MAXSIZE;
    36. ++sum;
    37. while (front!=rear) {
    38. p=que[front]; front=(front+1)%MAXSIZE;
    39. if (p==NULL) flag=1; //出现了空指针
    40. else {
    41. if (flag) return 0;
    42. ++sum;
    43. que[rear]=p->lchild; rear=(rear+1)%MAXISZE;
    44. que[rear]=p->rchild; rear=(rear+1)%MAXISZE;
    45. }
    46. }
    47. // 检查sum=2^n-1 --> sum+1是2的n次方
    48. sum = sum+1;
    49. if ( !( sum&(sum-1) ) ) return 1; //检查数num是否为2的k次方
    50. else return 0;
    51. }