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. 是否完全二叉搜索树(完全二叉树的判断)