PTA 7

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

输入格式:

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

输出格式:

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

输入样例1:

19 238 45 42 24 58 30 67 12 51

输出样例1:

138 45 24 58 42 30 12 67 51 2YES

输入样例2:

18 238 24 12 45 58 67 42 51

输出样例2:

138 45 24 58 42 12 67 51 2NO

满二叉树:假设这个二叉树有n层,那么每一层的节点数都达到最大的二叉树。
完全二叉树:把最后一层去掉就是满二叉树,同时最后一层:我们假设最后一层里面如果是满的话是有n个节点,我们从左往右标号1-n,那么最后一层如果想要有节点的话,一定要按照标号顺序建立,不能隔过一个或多个标号去建立其他的节点。

所以 我们分析一下 完全二叉树的特点:我们按照层次顺序遍历这颗树的过程中,对于任意一节点x
1 》如果x 有右子树,但是却没有左子树,这肯定不是完全二叉树
2 》如果x 有左子树,但是却没有右子树,那么剩余的所有节点一定要为叶子节点
3 》如果 x 左右子树都没有,那么剩余的所有节点也要为叶子节点

判断是否是完全二叉树很简单  查看是否连续即可  用数组建树方便很多

1#include<bits/stdc++.h> 2using namespace std; 3//input by bxd 4#define rep(i,a,b) for(int i=(a);i<=(b);i++) 5#define repp(i,a,b) for(int i=(a);i>=(b);i--) 6#define RI(n) scanf("%d",&(n)) 7#define RII(n,m) scanf("%d%d",&n,&m) 8#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) 9#define RS(s) scanf("%s",s); 10#define LL long long 11#define pb push_back 12#define fi first 13#define REP(i,N) for(int i=0;i<(N);i++) 14#define CLR(A,v) memset(A,v,sizeof A) 15/////////////////////////////////// 16#define inf 0x3f3f3f3f 17#define N 1000 18int a[N]; 19int n; 20 21void build() 22{ 23 CLR(a,-1); 24 rep(i,1,n) 25 { 26 int x; 27 RI(x); 28 int id=1; 29 while(1) 30 { 31 if(a[id]==-1) 32 { 33 a[id]=x;break; 34 } 35 else if(x>a[id]) 36 { 37 id<<=1; 38 } 39 else 40 id=id*2+1; 41 } 42 } 43} 44bool check() 45{ 46 int cnt=0; 47 int flag=1; 48 rep(i,1,N) 49 { 50 if(cnt==n)break; 51 if(a[i]!=-1) 52 { 53 cnt++; 54 cout<<a[i]; 55 cout<<(cnt==n?'\n':' '); 56 } 57 else//如果中断了说明不是完全二叉树 58 flag=0; 59 } 60 return flag; 61} 62int main() 63{ 64 RI(n); 65 build(); 66 if(check()) 67 printf("YES"); 68 else printf("NO"); 69 return 0; 70}

View Code

点赞
收藏

评论区

加载中...

相关推荐

PTA 是否同一棵二叉搜索树(25 分)

是否同一棵二叉搜索树(25 分)给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2,1,3}和{2,3,1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测

树与二叉树

二叉树层次建树二叉树(BinaryTree)是由有限个结点组成的集合,它或者为空集合,或者仅含一个根结点,或者由一个根结点和两棵互不相交的左、右子树组成。树为空即根节点为空。二叉树的基本形态如下图:a:空的二叉树,treeNULL。b:只有空节点的二叉树,

二叉树题集(持续更新中)

对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。1\.求二叉搜索树最大深度输入格式:输入给出一行整数序列作为二叉搜索树的键值,数字间以空格分隔,输入0结束(0不计入该二叉树键值)。输入样例:8685109110输出样例:4常规的求二叉搜索树深度的做法是递

python刷题-进制转换

十六进制转八进制问题描述  给定n个十六进制正整数,输出它们对应的八进制数。输入格式  输入的第一行为一个正整数n(1<n<10)。  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式  输出n行,每行为输入对应的八进制正整数。  【注意】  输入的十六进制数不会有

JAVA递归实现线索化二叉树

JAVA递归实现线索化二叉树基础理论首先,二叉树递归遍历分为先序遍历、中序遍历和后序遍历。先序遍历为:根节点左子树右子树中序遍历为:左子树根节点右子树后序遍历为:左子树右子树根节点(只要记住根节点在哪里就是什么遍历,且都是先左再右)线索化现在有这么一棵二叉树,它的数据结

LeetCode(98): 验证二叉搜索树

Medium!题目描述:给定一个二叉树,判断其是否是一个有效的二叉搜索树。一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/\