博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
L3-010 是否完全二叉搜索树 (30 分)
阅读量:1908 次
发布时间:2019-04-26

本文共 2460 字,大约阅读时间需要 8 分钟。

在这里插入图片描述

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

输入格式:

输入第一行给出一个不超过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
输入样例2:
8
38 24 12 45 58 67 42 51
输出样例2:
38 45 24 58 42 12 67 51
NO

#include
#include
#include
using namespace std;struct BinTree{
int value; struct BinTree *left,*right;};//根据输入的数据,构建一个二叉树; BinTree *createTree(struct BinTree *root,int value){
if(root==nullptr) {
root = new BinTree; root->value = value; root->left=root->right=nullptr; return root; } else {
if(value>root->value) root->left=createTree(root->left,value); else root->right=createTree(root->right,value); } return root;}//前序遍历: //vector
t;//void preOrder(struct BinTree *root)//{
// if(root==nullptr) return;// t.push_back(root->value);// preOrder(root->left);// preOrder(root->right);//}//队列输出实现层序遍历;vector
que; void queueOrder(struct BinTree *root){
struct BinTree *temp=nullptr; queue
q; if(root==nullptr) return; q.push(root);//插入队尾; while(!q.empty()) { temp = q.front();//取出队首元素; q.pop();//弹出队首元素; que.push_back(temp->value); if(temp->left!=nullptr) q.push(temp->left); if(temp->right!=nullptr) q.push(temp->right); }}/*判断条件: 1、树空,直接返回false;2、左子树为空,右子树不为空,直接返回false;3、左子树不为空,右子树为nullptr,或之后的左右节点都为nullptr,空且之后的结点有非叶子节点,则返回false; 4、左右子树都不为空,将左右子树依次插入到队列尾部; */int checked(struct BinTree *root){ if(root==nullptr) return 0; queue
q; struct BinTree *temp=nullptr; q.push(root); while(!q.empty()) { temp = q.front();//取队首元素; q.pop();//弹出队首元素; if(temp->left!=nullptr&&temp->right!=nullptr) { q.push(temp->left); q.push(temp->right); } if(temp->left==nullptr&&temp->right!=nullptr) return 0; //左子树不为空,右子树为空||左右子树都为空, 需要判断后面是否有非叶子结点; if(temp->left!=nullptr&&temp->right==nullptr||temp->left==nullptr&&temp->right==nullptr) { if(temp->left!=nullptr&&temp->right==nullptr) q.push(temp->left);//插入到队尾; //循环该节点之后的结点是否存在非叶子节点; while(!q.empty()) { temp=q.front(); q.pop(); //如果左右子树都为空,则该结点是叶子结点,则pop(),继续判断下一个结点; if(temp->left==nullptr&&temp->right==nullptr) q.pop(); else return 0;//存在非叶子节点; } } } return 1;}int main(){ struct BinTree *root=nullptr; int n=0,m=0,i=0,j=0,num=0; cin>>n; for(i=0;i
>num; root=createTree(root,num); } //层序序列; queueOrder(root); for(i=0;i

转载地址:http://fevcf.baihongyu.com/

你可能感兴趣的文章
Java集合学习之LinkedList
查看>>
Spring Security Oauth2 令牌增加额外信息
查看>>
Spring Security Oauth2 添加自定义过滤器和oauth2认证后API权限控制
查看>>
Spring Security Oauth2 如何增加自定义授权模式
查看>>
logback + Kafka + logstash 集成
查看>>
在SpringBoot1.5.x下如何使RedisTokenStore集群化
查看>>
Spring Cloud Consul应用下线后,健康检查自动删除无效服务
查看>>
spring cloud consul 应用的多实例名的解决
查看>>
kafka设置某个topic的数据过期时间
查看>>
linux系统编程之信号(五):实时信号与sigqueue函数
查看>>
225. 用队列实现栈
查看>>
linux系统编程之信号(六):竞态条件与sigsuspend函数
查看>>
124. 二叉树中的最大路径和
查看>>
LeetCode 148:排序链表 【归并】
查看>>
LeetCode 560 和为 k 的子数组
查看>>
LeetCode 581 最短无序连续子数组
查看>>
Flink本地部署报错 Could not resolve ResourceManager address ,提交job,显示taskmanagers等均为0
查看>>
Java Stream 使用
查看>>
Flink 的DataStream 和 DataSet区别
查看>>
Flink源码学习
查看>>