判断完全二叉树

int IsComplete(BiTree T)//判断二叉树是否完全二叉树,是则返回1,否则返回0 
{ 
  InitQueue(Q); 
  BiTree p;
  int flag = 0; 
  EnQueue(Q,T);
  while(!IsEmpty(Q)) {  
    DeQueue(Q,p); 
    if(!p)  //结点为空
       flag = 1; 
    else if(flag) //结点非空且flag为1
       return 0; 
    else {  //结点非空且flag为0,将结点左右孩子入队
      EnQueue(Q,p->lchild); 
      EnQueue(Q,p->rchild); //孩子无需判空
    } 
  }
  return 1; 
}
//已经包含空树的情况了

 

### 判断完全二叉树的代码实现 为了判断一棵二叉树是否为完全二叉树,可以采用层序遍历的方法。一旦遇到第一个空节点之后不应该再有非空节点出现,否则就不是完全二叉树。 以下是基于此逻辑使用C语言编写的函数来检测给定的二叉树是否为完全二叉树[^5]: ```c #include <stdbool.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode *left, *right; } TreeNode; bool isCompleteBinaryTree(TreeNode* root) { if (!root) return true; // 空树视为完全二叉树 // 创建一个队列用于层序遍历 typedef struct QueueNode { TreeNode* node; struct QueueNode* next; } QueueNode; QueueNode* queue = NULL, *rear = NULL, *tempQueueNode; bool metNull = false; // 初始化队列并加入根节点 tempQueueNode = (QueueNode*)malloc(sizeof(QueueNode)); tempQueueNode->node = root; tempQueueNode->next = NULL; queue = rear = tempQueueNode; while (queue != NULL) { // 出队操作 tempQueueNode = queue; TreeNode* currentNode = tempQueueNode->node; queue = queue->next; free(tempQueueNode); if (currentNode == NULL) { metNull = true; } else { // 当前节点不为空 if (metNull) return false; // 如果之前已经遇到了null,则返回false // 将左右孩子依次入队 tempQueueNode = (QueueNode*)malloc(sizeof(QueueNode)); tempQueueNode->node = currentNode->left; tempQueueNode->next = NULL; if (rear == NULL) { queue = rear = tempQueueNode; } else { rear->next = tempQueueNode; rear = tempQueueNode; } tempQueueNode = (QueueNode*)malloc(sizeof(QueueNode)); tempQueueNode->node = currentNode->right; tempQueueNode->next = NULL; rear->next = tempQueueNode; rear = tempQueueNode; } } return true; } ``` 上述程序定义了一个`isCompleteBinaryTree`函数接收指向二叉树根节点的指针作为参数,并返回布尔类型的值指示该二叉树是否为完全二叉树。这里采用了链表形式的手动管理队列来进行广度优先搜索(BFS),即所谓的层序遍历。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值