2021-4-4天梯赛训练赛1补题(是否完全二叉搜索树 (30 分))

Posted 如风如影�

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-4-4天梯赛训练赛1补题(是否完全二叉搜索树 (30 分))相关的知识,希望对你有一定的参考价值。

完全二叉搜索树

题目链接: link.

题目描述
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
输入格式
输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。
输出格式
将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO。

样例1

输入
9
38 45 42 24 58 30 67 12 51
输出
38 45 24 58 42 30 12 67 51
YES

样例2

输入
8
38 24 12 45 58 67 42 51
输出
38 45 24 58 42 12 67 51
NO

这个题目考察的还是比较综合的,首先考察了排序二叉树(并且不是常规排序二叉树,题目中定义的左儿子的值要比右儿子大),然后又考察了层序遍历,最后又考察了如何判断完全二叉树,是一个比较不错的题目,难度也比较大。

既然考察了完全二叉树,就先看看完全二叉树定义吧。
如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。并且n 个结点的完全二叉树的深度为 ⌊log2n⌋+1。这里 ⌊log2n⌋是取小于它的最大整数。
如果只有右儿子的话,那么这个树铁定不是完全二叉树。

举个例子

那么和完全二叉树容易混的就是满二叉树
满二叉树定义为如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。具有 n 个节点的满二叉树的深度为 log2(n+1)。

下图则是一个满二叉树

补充完这几个定义之后再回到这个题,第一次遍历到-1,如果还往队内添加元素,那么就不是个完全二叉树。

代码如下

#include <bits/stdc++.h>
using namespace std;
struct node
    int data;
    int lc,rc;
arr[55];
int cnt,j,b[55];
int k = 0,flag=0;
int build(int id,int x)

    if(id==-1)
    
        arr[cnt]=x,-1,-1;
        return cnt++;
    
    else 
       if(arr[id].data<x) arr[id].lc=build(arr[id].lc,x);
       else arr[id].rc=build(arr[id].rc,x);
    
    return id;

void ceng(int root)

    if(root==-1) return;
    queue<int> q;
    q.push(root);

    while(!q.empty())
    
        int id=q.front();
        q.pop();   
        b[j++]=arr[id].data;
        if(arr[id].lc!=-1) 
        
            q.push(arr[id].lc);
            if(flag==1) k=1;
        
        else flag=1;//左儿子为空,标记一下
        if (arr[id].rc != -1) 
        
            q.push(arr[id].rc);
            if(flag==1) k=1;
        
        else flag=1;
    

int main()

    int n;
    cin>>n;
    int root=-1;
    for(int i=1;i<=n;i++)
    
        int a;
        cin>>a;
       root=build(root,a);
    
    ceng(root);
    for(int i=0;i<j;i++)
    
        if(i==j-1) cout<<b[i]<<endl;
        else cout<<b[i]<<' ';
    
    if(k==1) cout<<"NO"<<endl;
    else cout<<"YES"<<endl;

    return 0;


以上是关于2021-4-4天梯赛训练赛1补题(是否完全二叉搜索树 (30 分))的主要内容,如果未能解决你的问题,请参考以下文章

天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟

PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

PTA2022年蓝桥杯及天梯赛赛前训练(C++练习)

L1-054 福到了(天梯赛补题)

2021-3-25天梯赛补题L1-046 整除光棍 (20 分)

PAT 天梯赛 是否同一棵二叉搜索树   (25分)(二叉搜索树)