完全二叉树
注意:完全二叉树与节点的标号没有关系
其中4号,5号,6号,7号节点为叶节点
判断完全二叉树
首先每个节点都会有以下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;
}