7-12 是否完全二叉搜索树(梯赛)

写在最前面: 近期有点繁忙有些题目没配图,真香。

1、题目

7-12 是否完全二叉搜索树(梯赛)

2、图文讲解

该题我是用数组来存储的, 用数组构造二叉树。(如果大佬还有更好的方法, 请留言指导)

大家都知道完全二叉树的图是这样的下↓(本着NPNBB 没有图片别哔哔的原则, 所以T.J 给你们画了几张图 )

7-12 是否完全二叉搜索树(梯赛)

在数组中表现的形式是一串连续的数
7-12 是否完全二叉搜索树(梯赛)

所以利用数组构建搜索树的这个特点 可以判断是否为完全二叉树。

3.代码实现:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int t[600000];//数组模拟搜索树
int N;
void insert(int i,int num)//插入函数
{
    if(t[i] == -1)//表示为空t[] = -1 表示该节点为空
    {
        t[i] = num;
    }

    else if(num > t[i])//如果比根大 递归到左儿子
    {
        insert(2*i+1, num);
    }
    else if(num < t[i])//如果比根小 递归到右儿子
    {
        insert(2*i+2, num);
    }


}


void Creat()//创建函数
{
    int i;
    for(i = 0; i < N; i++)
    {
        int num;
        scanf("%d", &num);
        insert(0,num);
    }
}
int que[600000];//队列用于层次遍历
int head;
int tail;
void cprint()//遍历函数
{
   if(t[0] == -1) return;
   head = 0;
   tail = 0;
   que[tail++] = 0;
   int i;
   while(head!= tail)
   {
       i = que[head];
      if(-1!=t[i])
      {
          if(t[2*i+1]!= -1)
          {
              que[tail++] = 2*i+1;
          }
          if(t[2*i+2]!= -1)
          {
              que[tail++] = 2*i+2;
          }
      }
      head++;
   }
   int p;//输出
   for(i = 0;i < tail;i++)
   {
       p = que[i];
       if(i< tail-1)printf("%d ", t[p]);
       else printf("%d\n", t[p]);

   }


}

int main()
{
    memset(t, -1, sizeof(t));//初始化为-1表示都为空节点

    scanf("%d", &N);
    Creat();
    int i;
    for(i = 0;i< N;i++)//  根据完全二叉树的特点判断是否为完全二叉树
    {
        if(t[i]== -1)break;
    }

    if(i == N)
    {
        cprint();
        printf("YES\n");
    }
    else
    {
        cprint();
        printf("NO\n");
    }


    return 0;
}