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