满二叉树和完全二叉树的区别:

一、完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

二、对于满二叉树,除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。而完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

1、满二叉树

70 什么是完全二叉树和什么满二叉树;

定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。

2、完全二叉树

70 什么是完全二叉树和什么满二叉树;

定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

7-13 是否完全二叉搜索树 (30 分)

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。

输入格式:

输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。

输出格式:

将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO

输入样例1:

9
38 45 42 24 58 30 67 12 51

输出样例1:

38 45 24 58 42 30 12 67 51
YES

 

#include <bits/stdc++.h>
using namespace std;
const int Max = 1e5+10;
int a[Max];
void add(int id, int num){
   if(a[id]==-1){
    a[id]=num;
    return ;
   }
   if(num>a[id]){
     add(id*2,num);
   }
   else {
    add(id*2+1,num);
   }

}
int main(){
    memset(a,-1,sizeof(a));
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        add(1,x);
    }
    bool ok=true;;
    for(int i=1;i<=n;i++){
        if(a[i]==-1) ok=false;
    }
    int i=1;
    int num=0;
    bool first=true;
    while(num<n){
        while(a[i]==-1) i++;
        if(first){
            first=false;
        }
        else {
            printf(" ");
        }
        printf("%d",a[i]);
        num++;
        i++;
    }
    printf("\n");
    if(ok) printf("YES\n");
    else printf("NO\n");

}

 

相关文章:

  • 2021-11-04
  • 2021-07-07
  • 2021-04-22
  • 2021-11-27
  • 2022-12-23
  • 2022-02-07
  • 2022-01-19
猜你喜欢
  • 2021-05-11
  • 2021-04-23
  • 2021-11-04
  • 2021-12-05
  • 2021-11-04
  • 2021-11-28
相关资源
相似解决方案