共翁号
共翁号 > 经验 > 编写算法判别给定二叉树是否为完全二叉树

编写算法判别给定二叉树是否为完全二叉树

原创2025-06-20 13:14:07

要判断一个二叉树是否是完全二叉树,可以使用层序遍历的方法。以下是算法的步骤和参考代码:

算法步骤

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),用于存储队列。

返回:经验

相关阅读