二叉查找树排序
简介
二叉查找树 也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 任意节点的左、右子树也分别为二叉查找树。
- 没有键值相等的节点
对一组数值 ,构造一棵二叉查找树的同时也把这组数值实现了排序。最差时间复杂度为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)