一个无重复的非负整数序列,必定对应唯一的一棵形状为完全二叉树的二叉搜索树。本题就要求你输出这棵树的层序遍历序列。

输入格式:

首先第一行给出一个正整数 N(≤1000),随后第二行给出 N 个不重复的非负整数。数字间以空格分隔,所有数字不超过 2000。

输出格式:

在一行中输出这棵树的层序遍历序列。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

10
1 2 3 4 5 6 7 8 9 0

输出样例:

6 3 8 1 5 7 9 0 2 4

自己的思路

(差两个测试点,以后解决了再补充)
这个方法可能比较好想到,但是写起来挺麻烦的,可以直接跳过看下一种写法。

#include<iostream>
#include<algorithm>
using namespace std;
typedef struct tree* Tree;
struct tree {int value;Tree left;Tree right;
};
struct queue
{Tree Data;struct queue* next;
};
struct queue* head = NULL , * tail = NULL;
Tree NewNode(Tree T,int n);
void Select(int fin[], Tree T, int start, int end);
Tree BuildTree(Tree T, int n);
void print(Tree T);//分层打印
void Pop(Tree T);
Tree Push();
int main()
{int n,b,fin[1005];cin >> n;for (int i = 0; i < n; i++){cin >> fin[i];}sort(fin, fin + n);int sum = 0,cen=1;//cen是每层最多节点个数while (1) {sum += cen;if (sum >= n) break;cen *= 2;}if (sum - n == 0)//正好最后一层铺满sum = (sum + 1) / 2;//以根节点为中心左半部分节点个数(包括根节点elsesum=(sum-cen+1)/2+cen-(sum-n);sum--;Tree T=NULL;T=NewNode(T,fin[sum]);if (sum != 0) {//这块的思路来源的想到之前写的通过中序和一个其他序重新构造二叉树int start = 0, end = sum - 1;Select(fin, T, start, end);start = sum + 1, end = n - 1;Select(fin, T, start, end);//建树完成,congratulations!}print(T);//通过层序遍历打印数据
}
void print(Tree T)
{if (!T) return;Tree point;Pop(T);//入栈while (head != NULL) {if(head!=NULL)point=Push();//出栈if (point->left) Pop(point->left);if (point->right) Pop(point->right);}
}
int flag = 0;
Tree Push()
{Tree temp = head->Data;head = head->next;if (flag == 1) cout << " ";flag = 1;cout << temp->value;return temp;
}
void Pop(Tree T)
{struct queue*temp = (struct queue*)malloc(sizeof(struct queue));temp->Data = T;temp->next = NULL;//***一开始忘了,然后程序崩溃了if (head == NULL) head = temp;else tail->next = temp;tail = temp;
}
Tree BuildTree(Tree T, int n)
{if (!T) T = NewNode(T, n);else {if (n < T->value) T->left=BuildTree(T->left, n);else T->right=BuildTree(T->right, n);}return T;
}
void Select(int fin[], Tree T, int start, int end)
{int mid = (start + end+1) / 2;T=BuildTree(T, fin[mid]);if(start!=mid)Select(fin, T, start, mid-1);if(mid!=end)Select(fin, T, mid+1, end);
}
Tree NewNode(Tree T, int n)
{if (!T) T = (Tree)malloc(sizeof(struct tree));T->value = n;T->left = T->right = NULL;return T;
}

参考代码(已AC):

参考博客

#include<iostream>
#include<algorithm>
using namespace std;
int a[1005], t[1005];
int n,pos=1;
void BuildTree(int index);
int main()
{cin >> n;//从1开始记节点方便找父亲节点与子节点的关系  father*2===father*2+1===childfor (int i = 1; i <= n; i++)cin >> a[i];sort(a + 1, a + 1 + n);//排序以后的a数组从1开始到n就是按照中序遍历排序的(这一点很重要,与下面的遍历有重大联系)BuildTree(1);for (int i = 1; i <= n; i++) {cout << t[i];if (i != n) cout << " ";}}
void BuildTree(int index)
{if (index * 2 <= n) BuildTree(index * 2);t[index] = a[pos++];//当index==8时,对应本体测试数据构成的二叉树的最左边的节点,也是所有数据中最小的//先到8,然后返回4,再到9,这个就是中序遍历,所以是按照这样的遍历方法将a里面的数据依次放入t数组(这个思路有点nubility!)if (index * 2 + 1 <= n) BuildTree(index * 2 + 1);
}

4-2-6 二叉树及其遍历 / 二叉搜索树 / 完全二叉树 完全二叉搜索树 (30 分)相关推荐

  1. 二叉树的链式存储结构--二叉链表

    1 二叉树的链式存储结构 //二叉链表的结点结构定义typedef int TElemType; typedef struct BiTNode {TElemType data;struct BiTNo ...

  2. b+树时间复杂度_满二叉树、完全二叉树、二叉搜索树、平衡二叉树

    "存在即合理"为什么需要每种树,本文不再冗余的总结每种树太多性质,就说重点. 二叉树(Binary Tree)主要包括:满二叉树.完全二叉树.二叉搜索树.平衡二叉树 性质太多,定义 ...

  3. 真c++ 从二叉树到红黑树(3)之二叉搜索树BST

      此文章为从二叉树到红黑树系列文章的第三节,主要介绍介绍二叉搜索树BST,为AVL和RedBlack打下基础 文章目录 一.前面文章链接~(点击右边波浪线可以返回目录) 二.二叉搜索树BST的定义~ ...

  4. 数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

    在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉 ...

  5. 【CCCC】L3-010 是否完全二叉搜索树 (30分),完全二叉树判断+层次遍历(奇怪的方法)

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

  6. 数据结构笔记(二十一)--二叉树的遍历

    二叉树的遍历 一.先序遍历 二.中序遍历 三.后序遍历

  7. 【数据结构pta】L3-1-二叉树及其遍历 / 二叉搜索树 / 完全二叉树 是否完全二叉搜索树分数 30

    L3-1-二叉树及其遍历 / 二叉搜索树 / 完全二叉树 是否完全二叉搜索树 分数 30 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左 ...

  8. 二叉树 1.0 -- 创建二叉树、遍历二叉树、二叉树常见问题求解

    树的结构主要是为了查找,这个主要是为了搜索,树的结构关注的不是增删查改 树 广义上面的树的结构我们不知道树的一个节点是有几个子节点的,所以这个时候我们需要定义的一种结构就是,一个节点的孩子是可以动态的 ...

  9. 【swjtu】数据结构实验6_二叉树的遍历算法

    实验内容及要求: 编写程序,用先序递归遍历法建立二叉树的二叉链表存储结构,然后输出其先序.中序.后序以及层次遍历结点访问次序.其中层次遍历的实现需使用循环队列.二叉树结点数据类型建议选用字符类型. 实 ...

最新文章

  1. 京东零售CEO徐雷升任京东集团总裁,刘强东:将把更多时间投入乡村振兴等事业中...
  2. antdesign 所兼容的浏览器_Edge 87.0最新离线稳定版浏览器
  3. Mysql在离线安装时提示:error: Found option without preceding group in config file
  4. Boost:circular_buffer作为边界缓冲区的基础容器
  5. layui 分页ajax,实现Ajax异步的layui分页
  6. python删除重复元素_Python-删除列表中重复元素的方法
  7. 服务器mysql数据库被人非法连接_如何让mysql数据库允许被远程连接访问
  8. java web 教程_Java Web服务教程
  9. WPFのclipToBounds与maskToBounds的区别
  10. 【E2EL5】A Year in Computer Vision中关于图像增强系列部分
  11. linux网关管理,利用Linux打造安全的管理型网关
  12. Watir的操作使用
  13. Linux系统设置固定ip
  14. 飞凌国产芯片系列经验分享|A40i开发板应用笔记-PWM 的应用
  15. 量化交易奇才大卫·哈丁的投资之路
  16. 美通企业周刊 | 湖北与百胜中国签署战略合作协议;喜茶首家环保主题店亮相深圳;万豪2021年将开设中国第400家酒店...
  17. Linux sed按行遍历文件内容,并删除匹配成功的行
  18. iOS 系统分享UIActivityViewController,自定义分享预览UI
  19. Ajax登录注册-----数据请求 交互
  20. 本周最新文献速递20211010

热门文章

  1. Nebula Graph 在企查查的应用
  2. 使用 GOLANG 发送邮件
  3. 30、【backtrader股票策略】《151 trading strategies》中的支撑与阻力策略(support and resistance)
  4. 祝早道日语七周年快乐!
  5. 命令行导入mysql数据库
  6. css特效实例——纯css实现带边角卷边阴影的纸
  7. 什么情况下单独计算机械台班,投标or签证,机械台班价如何确认?
  8. 【Scratch】青少年蓝桥杯_每日一题_11.25_小猫碰到黑块和白块
  9. 安装net_speeder
  10. Wireshark之流量包分析+日志分析 (护网:蓝队)web安全 取证 分析黑客攻击流程(上篇)