二叉树的层次遍历的应用

判定一颗二叉树是否为完全二叉树:

int JudgeComplete(BitTree *bt)  //判断二叉树是否是完全二叉树,如是,返回1,否则,返回0

【算法思想:判定是否是完全二叉树,可以使用队列,在遍历中利用完全二叉树“某节点没有左孩子,则一定无右孩子;若某节点缺左或右孩子,则其所有后继一定无孩子”的原则进行判断。(备注:判断时易犯的错误是证明其左子树和右子数都是完全二叉树,由此推出整棵二叉树必是完全二叉树的错误结论。)】

#include<stdio.h>
#include<malloc.h>
#define MaxSize  100
typedef  char ElementType;

typedef struct Node {
    ElementType data;               /* 数据域 */
    struct Node *lchild, *rchild; /* 左、右指针域,分别存储左、右孩子的存储位置 */
} BinaryTree;

/* 先序建立二叉树 */
BinaryTree *CreBiTree( ) {
    BinaryTree *bt;
    ElementType x;
    scanf("%c", &x);
    if (x == '#') {
        bt = NULL;
    } else {
        bt = (BinaryTree *)malloc(sizeof(BinaryTree));
        bt->data = x;
        bt->lchild = CreBiTree();
        bt->rchild = CreBiTree();
    }
    return bt;
}

typedef  struct  {
    BinaryTree*  data[MaxSize];
    int  rear;
    int  front;
} CirQueue;

/*顺序循环队列初始化*/
CirQueue * CreateQueue() {
    CirQueue *q;
    q = (CirQueue*) malloc( sizeof(CirQueue ));
    q->front = 0;
    q->rear = 0;
    return q;
}

/*顺序循环队列判空,返回1表示空,0表示非空*/
int QueueEmpty(CirQueue *q) {
    if (q->front == q->rear)
        return 1;
    else
        return 0;
}

/*顺序循环队列判满,返回1表示满,0表示非满*/
int QueueFull(CirQueue *q) {
    if (q->front == (q->rear + 1) % MaxSize)
        return 1;
    else
        return 0;
}

/*顺序循环队列入队*/
void EnQueue(CirQueue *q, BinaryTree* x) {
    if (QueueFull(q)) {
        printf("overflow!");
        return;
    }
    q->data[q->rear] = x;
    q->rear =  (q->rear + 1) % MaxSize;
}

/*顺序循环队列出队*/
BinaryTree* DeQueue(CirQueue *q) {
    BinaryTree* x;
    if (QueueEmpty(q)) {
        printf("underflow!");
        return NULL;
    }
    x = q->data[q->front];
    q->front =  (q->front + 1) % MaxSize;
    return x;
}

//判断二叉树是否是完全二叉树,如是,返回1,否则,返回0
int JudgeComplete(BinaryTree *bt) {
    CirQueue *q = CreateQueue();
    BinaryTree *p;
    if (!bt) {
        return 1;    // 空树为满二叉树
    }
    EnQueue(q, bt);
    while (!QueueEmpty(q)) {
        p = DeQueue(q);
        if (p) {    // 结点非空,将其左右子树入队
            EnQueue(q, p->lchild);
            EnQueue(q, p->rchild);
        } else {    // 结点为空,检查其后是否有非空结点
            while (!QueueEmpty(q)) {
                p = DeQueue(q);
                if (p) {    // 结点非空,则二叉树为非完全二叉树
                    return 0;
                }
            }
        }
    }
    return 1;
}
/*
          A                A
       /   \          /   \
      B     C         B     C
     / \   /        /     /
    D   E F           D        E
*/
void main() {
    // ABD##E##CF### ABD###CE###
    BinaryTree *bt;
    printf("input data:");
    bt = CreBiTree();
    if (JudgeComplete(bt)) {
        printf("是完全二叉树");
    } else {
        printf("不是完全二叉树");
    }

}

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值