第三章 3.2二叉查找树

来源:互联网 发布:sql cursor用法 编辑:程序博客网 时间:2024/06/11 08:13
在本节中,我们将学习一种能够将链表插入的灵活性和有序数组查找的高效性结合起来的符号表实现。具体来说,就是使用每个结点含有两个链接(链表中每个结点只含有一个链接)的二叉查找树来高效地实现符号表。
      结构术语:我们所使用的的数据结构有结点组成,结点包含的链接只能有一个父结点指向自己,而且每个结点都只有左右两个链接。分别指向自己的左子结点和右子结点。英雌将二叉树定义为一个空连接,或者是一个有左右两个链接的结点,每个链接都指向一棵子二叉树。在二叉查找树中,每个结点还包括了一格键和一个值,键之间也有顺序之分以支持高效的查找。
      定义:一棵二叉查找树是一棵二叉树,其中每个结点都含有一个comparable的键(以及相关联的值)且每个结点的键都大于其左子树的任意结点的键而小于右子树的任意结点的键。
   


     一. 基本实现
    
    数据表示

       和链表一样,我们嵌套定义了一个私有类来表示二叉查找树上的一个结点。每个结点都含有一个键、一个值、一个左链接、一个右链接和一个结点计数器。左链接指向一棵由小于该结点的所有键做成的二叉查找树,右链接指向一棵由大于该结点的所有键组成的二叉查找树。有链接变量N给出了以该结点为根的子树。
       注意:私有方法size()会将空链接的值当做0,由此我们可得     size(x) = size(x.left) +size(x.right) +1
       一棵二叉查找树代表了一组键的集合,而同一个集合可以 用多棵不同的二叉查找树表示。如果我们将一棵二叉查找树的所有键投影到一条直线上可保证一个结点的左子树中的键出现在它的左边,右子树的键出现在它的右边,那么我们一定可以得到一条有序的键列。用多棵二叉查找树表示同一组有序的键来实现构建和使用二叉查找树的搞笑算法。

       

   插入
     查找代码几乎和二分查找的一样简单,这种简洁性是二叉查找树的重要特性之一。而二叉查找树的另一个更重要的特性就是实现难度和查找差不多。


    分析
使用二叉查找树的算法的运行时间取决于树的形状,而树的形状又取决于键被插入的先后顺序。在最好的情况下,一棵含有N个结点的树是完全平衡的,每条空链接和根结点的距离都为~lgN。最坏的情况下,搜索路径上可能有N个结点。
     
3.2.3.5 删除最大键和删除最小键

二叉树中最难实现的就是delete




原创粉丝点击