判断是不是完全二叉树

根据完全二叉树的定义,对完全二叉树按照从上到下、从左到右的层次遍历,应该满足一下两条要求:
●某节点没有左孩子,则一定无右孩子
●若某节点缺左或右孩子,则其所有后继一定无孩子
若不满足上述任何一条,均不为完全二叉树。

#include <bits/stdc++.h>
using namespace std;
typedef struct node {
    char data;
    struct node *lchild;
    struct node *rchild;
} Node, *Bitree;
char ch;
Bitree T;
Node *CreateBitree() {
    cin >> ch;
    Bitree T;
    if(ch == '#') T = NULL;//注意:二叉树的输入需要严格遵守以#结尾的规则,并且输入顺序按照前序遍历的方式
    else {
        T = new node;
        T->data = ch;
        T->lchild = CreateBitree();
        T->rchild = CreateBitree();
    }
    return T;
}

int bfs(Bitree T) {   
 queue<Bitree>q;
    q.push(T);
    int flag = 1; //flag==1说明是完全二叉树
    int bj = 1; //bj==1说明当前所有节点都有左右孩子
    while(!q.empty()) {
        Bitree u = q.front();
        q.pop();
        if(u->lchild && u->rchild) {
            if(bj == 0) flag = 0;//bj为0说明在这之后的节点都不能有子节点
            if(!flag) break;
            q.push(u->lchild);
            q.push(u->rchild);
        }
        if(!u->lchild && u->rchild) {//如果出现左子树没有,右子树有,那么一定不是完全二叉树
            flag = 0;
            break;
        }
        if(u->lchild && !u->rchild) {
            if(!bj) flag = 0;
            bj = 0;
            if(!flag) break;
            q.push(u->lchild);
        }
        if(!u->lchild && !u->rchild) {
            bj = 0;
            if(!flag) break;
        }
    }
    if(flag) return 1;
    else return 0;
}

int main() {
    Bitree T;
    T = CreateBitree();
    if(bfs(T)) {
        printf("是完全二叉树\n");
    } else printf("不是完全二叉树");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80274146