您的位置:首页 > 编程语言 > Python开发

经典排序算法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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: