经典排序算法python回顾之四 二叉查找树排序

二叉查找树排序详解
本文介绍了二叉查找树的基本概念及其排序原理。通过构建二叉查找树实现数值排序,并探讨了不同情况下的时间复杂度。同时,文章还提供了Python实现代码示例。

二叉查找树排序

简介

二叉查找树 也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:

  1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 任意节点的左、右子树也分别为二叉查找树。
  4. 没有键值相等的节点
二叉查找树排序属于插入排序类,我们将涉及查找树的构建,插入(就是排序过程)。
对一组数值 ,构造一棵二叉查找树的同时也把这组数值实现了排序。最差时间复杂度为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)


转载于:https://my.oschina.net/vincent67/blog/186248

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值