通过队列实现判断一棵二叉树是否为完全二叉树

要实现题目的功能,则需在用队列遍历层次遍历二叉树的代码基础上作修改

层次遍历二叉树代码如下

void LevelOrder(BiTree bt, void (*visit)(TElemType))
/* travel BiTree bt by level, Return result by ss. */
{
    if(!bt)  return;
    BiTree p=bt;
    int i=0;
    Queue Q;
    InitQueue(Q);
    if(p!=NULL)
    {
       EnQueue(Q,p);
       while(!QueueEmpty(Q))
       {
          DeQueue(Q,p);
          visit(p->data);
          if(p->lchild!=NULL)
          EnQueue(Q,p->lchild);
          if(p->rchild!=NULL)
          EnQueue(Q,p->rchild);
       }
    }
}
然而在这段代码基础作修改上,我们将换另一种思维方式,即无论结点的左右孩子是否为空,都入队列,当二叉树不是完全二叉树时,则会遍历到空指针,代码如下:

Status CompleteBiTree(BiTree bt)
/* judge if the binary tree whose root is bt */
/*  is a complete tree.                      */
{
    if(!bt) return TRUE;
    BiTree p=bt; 
    Queue Q;
    int hasNullPointer=0;
    InitQueue(Q);
    if(p!=NULL)
    {
       EnQueue(Q,p);
       while(!QueueEmpty(Q))
       {
          DeQueue(Q,p);       
          if(!p)   hasNullPointer=1;
          else if(hasNullPointer==1)  return FALSE;
          else{
            EnQueue(Q,p->lchild);      //无论结点的左右孩子是否为空,都入队列   
            EnQueue(Q,p->rchild);
          }
       }
    }
    return TRUE;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用层次遍历(广度优先搜索)的方式来判断一棵是否完全二叉树。具体实现如下: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; bool isCompleteTree(TreeNode* root) { if (root == NULL) { return true; } bool flag = false; // 是否遇到过不满足完全二叉树的情况 TreeNode* queue[10000]; int front = 0, rear = 0; queue[rear++] = root; while (front < rear) { TreeNode* node = queue[front++]; if (node == NULL) { flag = true; } else { if (flag) { // 如果已经遇到过空节点,那么当前节点不应该存在左右子节点 return false; } queue[rear++] = node->left; queue[rear++] = node->right; } } return true; } int main() { // 构造一棵完全二叉树 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = 1; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->val = 2; root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->val = 3; root->left->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->left->val = 4; root->left->right = (TreeNode*)malloc(sizeof(TreeNode)); root->left->right->val = 5; root->right->left = (TreeNode*)malloc(sizeof(TreeNode)); root->right->left->val = 6; printf("%d\n", isCompleteTree(root)); // 输出1,表示是完全二叉树 // 构造一棵不完全的二叉树 TreeNode* root2 = (TreeNode*)malloc(sizeof(TreeNode)); root2->val = 1; root2->left = (TreeNode*)malloc(sizeof(TreeNode)); root2->left->val = 2; root2->right = (TreeNode*)malloc(sizeof(TreeNode)); root2->right->val = 3; root2->left->left = (TreeNode*)malloc(sizeof(TreeNode)); root2->left->left->val = 4; printf("%d\n", isCompleteTree(root2)); // 输出0,表示不是完全二叉树 return 0; } ``` 上述代码中,使用一个flag变量来记录是否遇到过空节点,如果遇到了,后面所有的节点都不应该存在左右子节点。如果在遍历过程中发现当前节点为NULL,就将flag设置为true;否则,如果已经遇到了空节点,就返回false;否则,就将当前节点的左右子节点加入到队列中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值