判断一个二叉树是否为完全二叉树

完全二叉树

注意:完全二叉树与节点的标号没有关系

其中4号,5号,6号,7号节点为叶节点

判断完全二叉树

首先每个节点都会有以下4种情况:

  

            情况1                                   情况2                                  情况3                                   情况4

我们开始寻找规律:

1:如果当前访问的节点的左右孩子是情况3,说明不是完全二叉树,直接返回false。

2:如果当前访问的节点的左右孩子是情况1,继续访问其他节点。

3:如果当前访问的节点的左右孩子是情况2或者情况4,那么我们定义一个状态(接下来访问的所有节点必须全部是叶子节点)。只要遇到情况2或者情况4,这个状态就开启了。

补充内容:


层次遍历的遍历顺序:1-->2-->3-->4-->5-->6-->7

代码如下:

struct node
{
    node left;
    node right;
    int value;
};
bool isCBT(node head)//判断以head为头节点的二叉树是否为完全二叉树
{
    if(head==null)
        return true;
    bool leaf=false;//leaf变量用来标记一个状态是否发生(只要当前节点的左孩子和右孩子都为空或者左孩子不为空,右孩子为空时,这个状态就发生,只要发生了这个状态,以后访问到的节点必须都是叶节点)
    queue < node >q;//通过队列q实现二叉树的层次遍历,通过层次遍历来判断是否为完全二叉树
    q.push(head);//加入头节点
    while (!!q.empty())
    {
        node p=q.front();
        q.pop();
        if((leaf&&(p.left!=null||p.right!=null))||(p.left==null&&p.right!=null))//这些判断条件是所有的不满足是完全二叉树的条件。条件一(第二个||前面的条件):上述的状态已经发生,但是当前访问到的节点不是叶节点(有左孩子或者右孩子)。条件二:当前节点有右孩子,没有左孩子
            return false ;
        if(p.left!=null)//左孩子不为空,加入到队列中去
            q.push(p.left);
        if(p.right!=null)//右孩子不为空,加入到队列中去
            q.push(p.right);
        if((p.left!=null&&p.right==null)||(p.left==null&&p.right==null))//这个if语句就是判断状态是否要发生
            leaf=true;
    }
    return true;
}

猜你喜欢

转载自blog.csdn.net/qq_40938077/article/details/80471997