Complete Binary Search Tree (30)

时间限制

100 ms

内存限制

65536 kB

代码长度限制

16000 B

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:

一个二叉排序树是利用递归来定义的,一个二叉排序树有下面这几个属性

  • The left subtree of a node contains only nodes with keys less than the node's key.

左子树的节点只包含key值比他小的节点

  • The right subtree of a node contains only nodes with keys greater than or equal to the node's key.

右子树的节点只包含key值比他大或者和它相等的节点

  • Both the left and right subtrees must also be binary search trees.

左字树和右字树都是二叉排序树

A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from left to right.

一个完全二叉排序树是一种完全满的树,可能有例外的就是最底层,它是从左到右排的。

Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT.

现在给一个连续的不重复的非负的整数值,如果要满足构造一个唯一的排序二叉树,那么这个树也一定满足完全二叉排序树。

You are supposed to output the level order traversal sequence of this BST.

要求你按照等级排序输出这个排序二叉树。

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (<=1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and are no greater than 2000.

每个输入文件包含一个测试案例。对于每个测试案例,第一行包含N<1000。下一行有N个不重复的非负整数。所有的数都在一行用空格分开,都不会超过2000。

Ouput Specification:

For each test case, print in one line the level order traversal sequence of the corresponding complete binary search tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.

对于每个测试案例,按照等级排序打印这个完全二叉排序树。所有的数都必须用空格分开,在行的最后必须没有额外的空格。

Sample Input:

10
1 2 3 4 5 6 7 8 9 0

Sample Output:

6 3 8 1 5 7 9 0 2 4
 
思考过程:
首先看到测试用例,先排序以下,把0拿到前面来
0 1 2 3 4 5    6    7 8 9
然后看输出,画出输出的树的样子
           6
        3     8
      1   5  7  9
    0 2  4 
 
然后思考,无论它给的数据怎么样,最后排序完成之后,就和一组连续的数一样,所以任何问题都可以看做是0-n的一个连续数据
然后观察,这棵树的特点,怎么从连续的数,变成一棵树。
 
下面要考虑的是问题的条件,为什么完全排序二叉树只有唯一的一种可能性,能否尝试举出反例呢?看下面这个树
           6
        4     8
      1   5  7  9
     0 2  3
乍一看好像满足,左边小中间中右边大的关系,可是仔细观察就会发现,4这个节点的右边字树出现了3这个节点,在二叉排序树中,不允许出现这样的情况,右边字树的任何一点都必须大于这个根节点。
 
那么现在我们已经真的理解了规则,下面一步就是尝试把问题变小。
 
0-9我们找不出规律,那么就从0开始
 
下面说的都是类似0-9这种已经排序完成的情况。
如果一个数0,那么什么好说的。
两个数,比较两个数的大小,小的作为左字树。
三个数,比较三个数的大小,最小的作为左字树,最大的作为右字树,剩下的是根节点。
四个数,问题就出现了,因为我们要满足完全性,所以我们很自然想到,先把后面三个按照三个数的方法生成一棵树,最后一个树放在第三层的最左边
如:  2
    1  3
   0
五个数,如果找不到排的方式,那么就先排出来
      3
    1   4
   0 2  
六个数,
      3
   1     5
  0 2   4
七个数
      3
   1     5
  0 2   4  6
八个数
       4
   2      6
  1  3   5  7
0
 
 
后面就不列举了,总之分析到这里,我想到两种思路。
1、想办法从0开始生成树,一个节点,一个节点往树里面加,加的同时去改变节点,使之能满足条件。
2、想办法分,找到类似中位数的方式,找到一个值,这个值左边的数和右边的数,均可以满足完全排序二叉树的规则,然后递归去处理。
 
但是确实两种方式均特别麻烦,第一种思路需要仔细分析生成的方式,如果没有查阅或者是提前学习二叉树生成的原理和方法的话自己想分析出来,还是比较吃力的。第二种思路,主要是找的那个值的分析比较麻烦,如何找到这样一个值,使之能满足条件呢?左边的数个数要满足多少,右边数要满足多少呢?
 
所以我暂时不想直接用这两种思路去实现,而想弄清楚二叉树的特性,然后再来解这道题。
所以明天会更新的不是这个的下篇,而是二叉树的特性,包含构造,查询,插入,删除等。

PAT1064(上)分析部分的更多相关文章

  1. AJAX练习(一):制作可以自动校验的表单(从原理上分析ajax的作用)

    继上文(AJAX(一)AJAX的简介和基础)作为联系. 传统网页在注册时检测用户名是否被占用,传统的校验显然缓慢笨拙. 当ajax出现后,这种体验有了很大的改观,因为在用户填写表单时,签名的表单项已经 ...

  2. 一个 Linux 上分析死锁的简单方法

    简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...

  3. 【转】一个 Linux 上分析死锁的简单方法

    简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...

  4. SVM:从数学上分析为什么优化cost function会产生大距离(margin)分类器

    向量内积 uTv = vTu为两个二维向量的内积,它等于p*||u||(其中p为向量v在向量u上的投影长度,是有+/-之分的,||u||为向量u的长度也称为范数),它是一个实数(是一个标量). 如上图 ...

  5. 掌握这10种方法帮你快速在Linux上分析二进制文件

    我们每天都使用二进制文件,但对二进制文件知之甚少.二进制是指您每天运行的可执行文件,从命令行工具到成熟的应用程序.Linux提供了丰富的工具集,可轻松进行二进制分析!无论您的工作角色是什么,如果您在L ...

  6. 硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的实现原理

    前提 很早之前就打算看一次JUC线程池ThreadPoolExecutor的源码实现,由于近段时间比较忙,一直没有时间整理出源码分析的文章.之前在分析扩展线程池实现可回调的Future时候曾经提到并发 ...

  7. erlang 线上分析工具集锦

    1.Recon-Erlang线上系统诊断工具(引自): Erlang系统素以稳定可靠闻名,但是它也是c实现的,也是要管理比如内存,锁等等复杂的事情,也会出现Crash,而且crash的时候大部分原因是 ...

  8. 从源代码上分析ListView的addHeaderView和setAdapter的调用顺序

    ListView想要加入headerview的话,就要通过addHeaderView这种方法,然后想要为ListView设置数据的话,就要调用setAdapter方法了.可是,在调用addHeader ...

  9. 从源码上分析ListView的addHeaderView和setAdapter的调用顺序

    ListView想要添加headerview的话,就要通过addHeaderView这个方法,然后想要为ListView设置数据的话,就要调用setAdapter方法了.但是,在调用addHeader ...

  10. Android在网络上分析获取图片(支持bmp格式)

    Android学习系列 - 在网络上显示的图像(支持bmp格公式)) 参见例如,下面的代码: /**     * 至Url地址上去照片.并返回Bitmap回来     *     * @param i ...

随机推荐

  1. pickView不需要明确设置高度

    pickView不用设置高度,若设置了,在iOS8.4.1上不会被填充,会造成没有把pickView高度设置成你想要的,但是布局其他地方的时候却会从你设置的地方开始,就会造成布局不紧挨着或者遮盖着的效 ...

  2. boost log库

    http://blog.csdn.net/sheismylife/article/category/1820481

  3. 借助nginx搭建反向代理服务器小例

    1 反向代理: 反向代理(Reverse Proxy)方式是指以代理服务器接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接 ...

  4. iOS学习笔记(01) - 泛型

    决定新开一坑,在不断学习的同时分享自己的学习历程给大家,既是对自己学习的记录,又希望能对大家提供些微的帮助. 这一篇文章主要来介绍泛型的意义.使用与声明方法等. 1.泛型:限制类型 1.1.泛型使用场 ...

  5. Html的Table与Echart的饼图实现联动效果

    功能描述: 单击Table中的某个单元格,Echart的饼图加载相关的数据,鼠标悬停在Echarts饼图中的某一块中,Table显示与Echarts饼图相关的数据. 例:楼宇经济概要显示每一个季度所有 ...

  6. APP生产流程图片解说

    尽我所能总结下一个app的生产过程,未必完整,也未必是所有的app产生的一个过程,不同公司会有很大的不同,我只是想总结下一般的大众的,做个参考. 需求策划: 设计: 开发: 测试: 发布没什么可画的了 ...

  7. [转]html 移动互联网终端的javascript touch事件,touchstart, touchend, touchmove

    前言 如果我们允许用户在页面上用类似桌面浏览器鼠标手势的方式来控制WEB APP,这个页面上肯定是有很多可点击区域的,如果用户触摸到了那些可点击区域怎么办呢??诸如智能手机和平板电脑一类的移动设备通常 ...

  8. 《Windows驱动开发技术详解》之驱动程序调用驱动程序——通过设备指针调用其他驱动程序

    本节介绍“手动”构造各个IRP,然后将IRP传递到相应驱动程序的派遣函数里. 获得设备指针 每个内核中的句柄都会和一个内核对象的指针联系起来.ZwCreateFile内核函数可以通过设备名打开设备句柄 ...

  9. MFC中将编辑框文本转换成整数,从而实现两个整数相加。

    在头文件中,定义三个控件变量,如m_data1,m_data2,m_sum; void Cuse_demo_dllDlg::OnBnClickedButton1(){ CString data1; C ...

  10. Internet History, Technology and Security (Week1)

    Week1. History: Dawn of Electronic Computing War Time Computing and Conmmunication Keywords: Electro ...