数据结构和算法15 之二叉树排序

 顾名思义,二叉树排序就是利用二叉搜索树的特点进行排序,前面提到过二叉搜索树的特点是,左子节点比自己小,右子节点比自己大,那么二叉树排序的思想就是先将待排序序列逐个添加到二叉搜索树中去,再通过中序遍历二叉搜索树就可以将数据从小到大取出来。如果对二叉树还不太了解,请看这篇博文:数据结构算法之二叉树 ,这里不再赘述。

下面我们来看看二叉树排序的实现:

[java] view plain copy

 

  1. public class Tree2Sort {  
  2.     private Node root;  
  3.     public Tree2Sort() {  
  4.         root = null;  
  5.     }  
  6.     public Node getRoot() {  
  7.         return root;  
  8.     }  
  9.     public void insertSort(int[] source) {  
  10.         for(int i = 0; i < source.length; i++) {  
  11.             int value = source[i];  
  12.             Node node = new Node(value);  
  13.             if(root == null) {  
  14.                 root = node;  
  15.             }  
  16.             else {  
  17.                 Node current = root;  
  18.                 Node parent;  
  19.                 boolean insertedOK = false;  
  20.                 while(!insertedOK) {  
  21.                     parent = current;  
  22.                     if(value < current.value) {  
  23.                         current = current.leftChild;  
  24.                         if(current == null) {  
  25.                             parent.leftChild = node;  
  26.                             insertedOK = true;  
  27.                         }  
  28.                     }  
  29.                     else {  
  30.                         current = current.rightChild;  
  31.                         if(current == null) {  
  32.                             parent.rightChild = node;  
  33.                             insertedOK = true;  
  34.                         }  
  35.                     }  
  36.                 }  
  37.                   
  38.             }  
  39.         }  
  40.     }  
  41.     //中序遍历  
  42.     public void inOrder(Node current) {  
  43.         if(current != null) {  
  44.             inOrder(current.leftChild);  
  45.             System.out.print(current.value + " ");  
  46.             inOrder(current.rightChild);  
  47.         }  
  48.     }  
  49. }  
  50. class Node {  
  51.     public int value;  
  52.     Node leftChild;  
  53.     Node rightChild;  
  54.     public Node(int val) {  
  55.         value = val;  
  56.     }  
  57. }  

        算法分析:二叉树的插入时间复杂度为O(logN),所以二叉树排序算法的时间复杂度为O(NlogN),但是二叉树排序跟归并排序一样,也需要额外的和待排序序列大小相同的存储空间。空间复杂度为O(N)。

转载:http://blog.csdn.net/eson_15/article/details/51193330

时间: 2024-09-19 09:38:45

数据结构和算法15 之二叉树排序的相关文章

数据结构和算法17 之拓扑排序

  这一节我们学习一个新的排序算法,准确的来说,应该叫"有向图的拓扑排序".所谓有向图,就是A->B,但是B不能到A.与无向图的区别是,它的边在邻接矩阵里只有一项(友情提示:如果对图这种数据结构部不太了解的话,可以先看一下这篇博文:数据结构和算法之 无向图.因为拓扑排序是基于图这种数据结构的). 有向图的邻接矩阵如下表所示:   A B C A 0 1 1 B 0 0 1 C 0 0 0         所以针对前面讨论的无向图,邻接矩阵的上下三角是对称的,有一半信息是冗余的.而

数据结构与算法C#版笔记--排序(Sort)-下

5.堆排序(HeapSort) 在接触"堆排序"前,先回顾一下数据结构C#版笔记--树与二叉树 ,其中提到了"完全二叉树"有一些重要的数学特性: 上图就是一颗完全二叉树,如果每个节点按从上到下,从左至右标上序号,则可以用数组来实现顺性存储,同时其序号: 1.如果i>1,则序号为i的父结节序号为i/2(这里/指整除) 言外之意:整个数组前一半都是父节点,后一半则是叶节点 2.如果2*i<=n(这里n为整颗树的节点总数),则序号为i的左子节点序号为2*i 3

数据结构和算法11 之基础排序

前10节我们学习了一些经典的数据结构,从这节开始,我们将学习一些排序算法.这一节我们先学习几个基础排序算法:冒泡排序,选择排序和插入排序. 1. 冒泡排序         冒泡排序算法运行起来非常慢,但在概念上它是排序算法中最简单的,因此冒泡排序算法在刚开始研究排序技术时是一个非常好的算法.冒泡排序算法的基本流程是:每一轮从头开始两两比较,将较大的项放在较小项的右边,这样每轮下来保证该轮最大的数在最右边. 算法程序如下: [java] view plain copy   public void 

数据结构与算法04 之二叉树

   在有序数组中,可以快速找到特定的值,但是想在有序数组中插入一个新的数据项,就必须首先找出新数据项插入的位置,然后将比新数据项大的数据项向后移动一位,来给新的数据项腾出空间,删除同理,这样移动很费时.显而易见,如果要做很多的插入和删除操作和删除操作,就不该选用有序数组.         另一方面,链表中可以快速添加和删除某个数据项,但是在链表中查找数据项可不容易,必须从头开始访问链表的每一个数据项,直到找到该数据项为止,这个过程很慢.         树这种数据结构,既能像链表那样快速的插入

Java数据结构及算法实例:选择排序 Selection Sort_java

/** * 选择排序的思想: * 每次从待排序列中找到最小的元素, * 然后将其放到待排的序列的最左边,直到所有元素有序 * * 选择排序改进了冒泡排序,将交换次数从O(N^2)减少到O(N) * 不过比较次数还是O(N) */ package al; public class SelectSort { public static void main(String[] args) { SelectSort selectSort = new SelectSort(); int[] elements

数据结构和算法12 之希尔排序

 上一章我们学习了冒泡排序.选择排序和插入排序三种基础排序算法,这三种排序算法比较简单,时间复杂度均为O(N2),效率不高.这节我们讨论一个高级排序算法:希尔排序.希尔排序是基于插入排序的,插入排序有个弊端,假设一个很小的数据项在很靠近右端的位置上,那么所有的中间数据项都必须向右移动一位,这个步骤对每一个数据项都执行了将近N次的复制,这也是插入排序效率为O(N2)的原因.         希尔排序的中心思想是将数据进行分组,然后对每一组数据进行插入排序,在每一组数据都有序后,再对所有的分组利用插

数据结构与算法C#版笔记--排序(Sort)-上

这里讨论的仅限于内部排序(即全部数据都在内存中,通过CPU运算处理元素排序),而且仅限顺序表排序(即不讨论链表,树状结构等结构的排序) 注:排序后的结果可以从小到大,或者从大到小,这只是一个相反的处理而已,为方便起见,本文中的方法都是从小到大排序 1.直接插入排序(InsertOrder) 思路:从第二个元素开始向后遍历,检查本身(后面称之为tmp)与前面相邻元素的大小,如果发现前面的元素更大,则依次从近及远(即倒序遍历)检查前面的所有元素,将比自身元素大的元素依次后移,这样最终将得到一个空位,

数据结构与算法系列(2)基础排序算法

前言 在计算机中实现存储数据最普遍的两种操作就是排序和查找.这是从计算机产业初始就已经确认的 了.这意味着排序和查找也是计算机科学领域最值得研究的两种操作.本书提到的许 多数据结构的主要设计目的就是为了使排序和/或查找更加简单,同时也是为了数据在结构内的存 储更加有效. 本章会介绍有关数据排序和查找的基础算法.这些算法仅依赖数组作为数据结构,而且所采用的 "高级"编程技术只是递归.本章还介绍了用来非正式分析不同算法之间速度与效率的方 法,此方法贯穿全书. 1.排序算法 人们在日常生活中

JavaScript数据结构和算法之二叉树详解

 这篇文章主要介绍了JavaScript数据结构和算法之二叉树详解,本文讲解了二叉树的概念.二叉树的特点.二叉树节点的定义.查找最大和最小值等内容,需要的朋友可以参考下     二叉树的概念 二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点.二叉树中每一个节点都是一个对象,每一个数据节点都有三个指针,