三种判断完全二叉树的方法的实现与分析

概述

Dijkstra算法、Prim算法等都要用堆才能优化,几乎每次都要考到的二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树。对于一棵完全二叉树,叶子节点只可能出现在最下层和倒数第二层,且最下层的叶子节点集中在树的最左部。

  1. 层次遍历法

    基本思路

  1. 实现

 

//CompleteBiTree.c
//创建一棵树,并判断其是不是完全二叉树
//主要用到队列的方式,并采用循环队列
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <time.h>
 
#define MAX_NUM_OF_QUEUE 20
#define YES 1
#define NO 0
 
typedef struct node
{
    int num;
    struct node *leftSon;
    struct node *rightSon;
}biNode;
 
biNode* 
CreateBiTree(int array[],int n)   //建树
{
    biNode *root;
 
    if((-1 == array[n]) || (n >= MAX_NUM_OF_QUEUE))   //以-1标记空节点
       return NULL;
    
    root = (biNode *)malloc(sizeof(biNode));
    root->num = array[n];
    root->leftSon = CreateBiTree(array,2*n+1);       //递归左子树建树
    root->rightSon = CreateBiTree(array,2*n+2);      //递归右子树建树
 
    return root;
}
 
int 
Adjust(biNode *root)
{
    biNode queue[MAX_NUM_OF_QUEUE];
    int front = -1;
    int rear = 0;
    int flag = 0;
    
     if(root == NULL)
       return NO;
    
    queue[rear] = *root;
    
    while(front != rear)
    {
       front = (front + 1)%MAX_NUM_OF_QUEUE;
       
       if((queue[front].leftSon == NULL) && (queue[front].rightSon != NULL))
           return NO;
       
       if(flag == 0) //标记是否满足判断的条件
       {
           if(((queue[front].leftSon == NULL) && (queue[front].rightSon == NULL)) || ((queue[front].leftSon != NULL) && (queue[front].right
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值