什么是二叉树(Binary Tree)
每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。
二叉树包含三种特殊的二叉树,完全二叉树、完满二叉树和完美二叉树。
首先带大家了解一下完全二叉树、完满二叉树、完美二叉树定义和的区别。
完全二叉树定义(Complete Binary Tree):若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
完满二叉树定义(Full Binary Tree):一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
完美二叉树(Perfect Binary Tree):除了叶子结点之外的每一个结点都有两个孩子结点。(只要你有孩子,你就必然是有两个孩子。)每一行都不需要被完全填充。
bool Judge_Complete(BiTree T) //判断二叉树是否是完全二叉树
{
BiTree t;
SqQueue Q; //创建一个空队列
InitQueue(Q);
EnQueue(Q,T); //将T的头结点入队
t = T; //给t赋初值T根节点
if(T==NULL)
return false;
while(QueueLength(Q))
{
if(t->lchild==NULL && t->rchild!=NULL) //如果左孩子为空右孩子不为空,说明一定不是完全二叉树
return false;
if(t->lchild!=NULL && t->rchild!=NULL) //左右孩子都不为空
{
DeQueue(Q,t); //删除该双亲节点
EnQueue(Q,t->lchild); //将左孩子入队
EnQueue(Q,t->rchild); //将右孩子入队
}
//如果左孩子不为空右孩子为空,或者左右孩子都为空(该节点为叶子结点)
//则该节点之后的所有节点都应该是叶子结点
if((t->lchild!=NULL && t->rchild==NULL) || (t->lchild==NULL && t->rchild==NULL))
{
DeQueue(Q,t); //从刚才判断的节点的下一个节点一次判断剩下队列中的节点是否左右子树都为空
while(QueueLength(Q))
{
if(t->lchild==NULL && t->rchild==NULL)
DeQueue(Q,t);
else
return false;
}
return true;
}
}
return true;
}
下面解释一下该算法的执行步骤:
1>如果树为空,则直接返回错。
2>如果树不为空:层次遍历二叉树 ;
2.1>如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;
2.2>如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列;
2.3>如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点; 该树才是完全二叉树,否则就不是完全二叉树。