要判断一个二叉树是否是完全二叉树,可以使用层序遍历的方法。以下是算法的步骤和参考代码:
算法步骤
1. 如果树为空,则返回`true`(空树也被视为完全二叉树)。
2. 使用队列进行层序遍历。
3. 如果遇到一个节点,其左孩子为空而右孩子不为空,则该树不是完全二叉树,返回`false`。
4. 如果遇到一个节点,其左孩子不为空而右孩子为空,或者左右孩子都为空,则标记当前节点之后的节点为叶子节点。
5. 如果后续节点中没有遇到左右孩子不全的情况,则该树是完全二叉树,返回`true`。
参考代码
```c
include include include // 定义二叉树节点结构体 typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; } *BiTree; // 判断二叉树是否是完全二叉树的函数 bool isCompleteBiTree(BiTree bt) { if (bt == NULL) return true; // 空树视为完全二叉树 BiTree *queue = (BiTree *)malloc(sizeof(BiTree) * 100); // 假设树的节点数不会超过100 int front = 0, rear = 0; queue[rear++] = bt; while (front < rear) { BiTree p = queue[front++]; if (p->lchild != NULL) { if (p->rchild == NULL) return false; // 如果左孩子不为空,右孩子为空,则不是完全二叉树 queue[rear++] = p->lchild; } else { if (p->rchild != NULL) return false; // 如果左孩子为空,右孩子不为空,则不是完全二叉树 } if (p->rchild != NULL) { if (p->lchild == NULL) return false; // 如果右孩子不为空,左孩子为空,则不是完全二叉树 queue[rear++] = p->rchild; } } free(queue); return true; } // 示例使用 int main() { // 创建一个示例二叉树 BiTree root = (BiTree)malloc(sizeof(BiTNode)); root->data = 'A'; root->lchild = (BiTree)malloc(sizeof(BiTNode)); root->lchild->data = 'B'; root->rchild = (BiTree)malloc(sizeof(BiTNode)); root->rchild->data = 'C'; root->lchild->lchild = NULL; root->lchild->rchild = NULL; root->rchild->lchild = NULL; root->rchild->rchild = NULL; // 判断是否为完全二叉树 if (isCompleteBiTree(root)) { printf("The given binary tree is a complete binary tree.\n"); } else { printf("The given binary tree is not a complete binary tree.\n"); } // 释放内存 free(root->lchild); free(root->rchild); free(root); return 0; } ``` 解释 使用一个队列来进行层序遍历。 遍历过程中,如果发现某个节点的左孩子为空而右孩子不为空,或者左孩子不为空而右孩子为空,则返回`false`。 如果所有节点都符合完全二叉树的性质,则返回`true`。 这个算法的时间复杂度是O(n),其中n是树中节点的数量,因为每个节点都会被访问一次。空间复杂度也是O(n),用于存储队列。返回:经验