算法题---完全二叉树的判定
思想:根据完全二叉树的定义,对完全二叉树按照从上到下、从左到右的层次遍历,应该满足一下两条要求:
●某节点没有左孩子,则一定无右孩子
●若某节点缺左或右孩子,则其所有后继一定无孩子
若不满足上述任何一条,均不为完全二叉树。
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; }