算法题---完全二叉树的判定

思想:根据完全二叉树的定义,对完全二叉树按照从上到下、从左到右的层次遍历,应该满足一下两条要求:

某节点没有左孩子,则一定无右孩子

若某节点缺左或右孩子,则其所有后继一定无孩子

若不满足上述任何一条,均不为完全二叉树。

 

void IsComplete_BiTree(BiTree T)
{
    if (T == NULL) { cout << "NULL BITREE error!" << endl; return; }
    Node*Q[MAXSIZE];Node*p=NULL; int f = 0; int r = 0;
    int final_judge = 1;    //迄今为止二叉树为完全二叉树。初值为1。
    int flag = 1;    //迄今为止所有节点均有左右孩子。初值为1。
    Q[r]= T; r++;
    p = T;
    while (f != r)
    {
        p=Q[f]; f++;
        /*p结点没有左孩子*/
        if (p->lc == NULL)    
        {
            flag = 0;
            if (p->rc != NULL)    //没有左孩子但有右孩子
                final_judge = 0;    //则不是完全二叉树
        }
        /*p结点有左孩子*/
        else 
        {
            if (flag == 1)   //迄今为止所有结点都有左、右孩子
            {
                Q[r] = p->lc; r++;    //左孩子入队
                if (p->rc)    //有右孩子,则右孩子入队
                {
                    Q[r] = p->rc; r++;
                }
                else flag = 0;    //否则,flag置0
            }
            else    //迄今为止已有结点缺孩子
                final_judge = 0;
        }
    }
    if (final_judge == 1)    cout << "是完全二叉树。" << endl;
    else cout << "不是完全二叉树。" << endl;
    return;
}

 

posted @ 2017-04-23 12:30  raye  阅读(1185)  评论(0编辑  收藏  举报