经典排序算法python回顾之四 二叉查找树排序
2013-12-20 14:30
471 查看
二叉查找树排序
简介
二叉查找树 也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
任意节点的左、右子树也分别为二叉查找树。
没有键值相等的节点
二叉查找树排序属于插入排序类,我们将涉及查找树的构建,插入(就是排序过程)。
对一组数值 ,构造一棵二叉查找树的同时也把这组数值实现了排序。最差时间复杂度为O(n^2)。例如,该组数值如果已经是自小至大有序,则构造出来的二叉查找树的所有节点都没有左子树。自平衡二叉查找树可以克服上述缺点,时间复杂度为O(nlog n)。但是,树排序的问题是CPU Cache性能差,特别是当节点是动态内存分配时。而堆排序的CPU Cache性能好。另一方面,树排序是最优的增量排序(incremental sorting)算法,保持一个数值序列的有序性。
每个结点的Ci为该结点的层次数。最坏情况下,当先后插入的关键字有序时,构成的二叉查找树蜕变为单支树,树的深度为n,其平均查找长度为(n+1)/2(和顺序查找相同),最好的情况是二叉查找树的形态和折半查找的判定树相同,其平均查找长度和log2(n)成正比O(log2(n))。
python代码
class empty_node: def __init__(self): self.flag = 1 class binary_tree: def __init__(self, value): self.data = value self.flag = 0 self.left = empty_node() self.right = empty_node() def insert_node(self, value): if value < self.data: if self.left.flag: self.left = binary_tree(value) else: self.left.insert_node(value) elif value > self.data: if self.right.flag: self.right = binary_tree(value) else: self.right.insert_node(value) def LDR(bt): out_list = [] if bt.left.flag: out_list.append(bt.data) if not bt.right.flag: output(bt.right) elif not bt.left.flag: output(bt.left) out_list.append(bt.data) if not bt.right.flag: output(bt.right) return out_list def BTS(list): bt = binary_tree(list[0]) for i in list[1:]: bt.insert_node(i) return LDR(bt)
相关文章推荐
- 经典排序算法回顾:插入排序,冒泡排序
- 经典排序算法python回顾之一 交换排序
- python排序算法-冒泡排序,选择排序,直接插入排序,希尔排序,归并排序,快速排序,堆排序
- 排序算法的C++ && Python实现---希尔排序(缩小增量排序)
- 用JavaScript实现十大经典排序算法--选择排序
- 经典排序算法:堆排序(python)
- 排序算法总结(冒泡排序、直接插入排序、希尔排序)(python实现)
- 经典排序算法 - 基数排序Radix sort
- Python实现经典排序算法(转载)
- python实现排序算法一:快速排序
- 经典排序算法 - 基数排序Radix sort
- Python练手之6种经典排序算法
- 十大经典排序算法之交换排序
- 用Python实现八大排序算法--直接选择排序
- 《面试》 几种经典的简单的排序方法(冒泡,选择,插入)python实现
- Python排序算法-快速排序
- 经典排序算法 - 基数排序Radix sort
- 闲暇之余有必要再回顾一下经典排序,理一理哈。
- 排序算法四:归并排序基本原理以及Python实现
- C#实现所有经典排序算法(选择排序,冒泡排序,快速排序,插入排序,希尔排序)