数据结构与算法分析笔记(c++)_树_预备知识

对于大量的输入数据,链表的线性访问时间太长,不宜使用。本章我们介绍一种简单的数据结构,其大部分操作的运行时间平均为O(logN)。
我们涉及的这种数据结构叫作二叉查找树(binary search tree)。二叉查找树是在很多应用程序中都有使用的两个库集合类set和map的实现基础。在计算机科学中树(tree是非常有用的抽象概念,因此,我们将讨论树在其他更一般的应用中的使用。在这一章,我们将
·了解树是如何用于实现几个流行的操作系统中的文件系统的。
·了解树如何用来计算算术表达式的值。
·指出如何利用树支持以O(logN)平均时间进行的各种搜索操作,以及如何细化以得到最坏情况时间界O(logN)。我们还将讨论当数据被存放在磁盘上时如何实现这些操作
讨论并使用set和map类。

4.1预备知识
树(tree)可以用几种方式定义。定义树的一种自然的方式是递归的方法。一棵树是一些结点的集合。这个集合可以是空集;若不是空集,则树由称作根(root)的结点以及零个或多个非空的(子)树T,T2,…,Tk组成,这些子树中每一棵的根都被来自根的一条有向的边(edge)所连接。
每一棵子树的根叫作根r的儿子(child),而r是每一棵子树的根的父亲(parent)在这里插入图片描述
从递归定义中可以发现,一棵树是n个结点和N-1条边的集合,其中的一个结点叫作根。在这里插入图片描述
在图4-2的树中,结点A是根。结点F有一个父亲A并且有儿了K、L和M。每一个结点可以有任意多个儿子,也可能没有儿子。没有儿子的结点称为叶(leaf)结点;图42中的叶结点
(树叶)是B、C、H、Ⅰ、P、Q、K、L、M和N。具有相同父亲的结点为兄弟(siblings)结点,因此,K、L和M都是兄弟。用类似的方法可以定义祖父(grandparent)和孙子(grandchild)关系。
从结点n1到nk的路径(path)定义为结点n1,n2,…,nk的一个序列,使得对于1≤ⅸk,结点ni是n(i+1)的父亲(只走父子路径)。路径的长(length)为路径上的边的条数,即k-1。从每一个结点到它自己有一条长为0的路径。注意,在一棵树中从根到每个结点
对任意结点n,n的深度(depth)为从根到n的唯一路径的长。因此,根的深度为0。n1的高(height)是从n到一片树叶的最长路径的长。因此所有的树叶的高都是0。一棵树的高等于它的根的高。对于图4-2中的树,E的深度为1面高为2;F的深度为1而高也是1;该树的高为3。
如果存在从n到n2的一条路径,那么n1是n2的一位祖先(ancestor)而n2是n1的一个后裔(descendant)。如果n1≠n2,那么n1是n2的一位真祖先(proper ancestor)而n2是n1的一个真后裔proper descendant
4.1.1树的实现
实现树的一种方法是在每一个结点除数据外还要有一些链,来指向该结点的每一个儿子。
将每个结点的所有儿子都放在树结点的链表中。图4-3所示是非常典型的声明。

在这里插入图片描述
在这里插入图片描述
4.1.2树的遍历及应用
树有很多应用。流行的用法之一是用于包括UNIX和DOS在内的许多常用操作系统中的目录结构。图45是UNIX文件系统中的一个典型的目录。在这里插入图片描述
/usr/mark/ b0ok/ch1.r,先后三次通过最左边的儿子结点而得到。第个“/”后的每个“/”都表示一条边;结果为一全路径名(pathname)。这个分级文件系统非常流行,因为它使得用户能够逻辑地组织数据。不仅如此,在不同目录下的两个文件还可以享有相同的名字,因为它们必然有从根开始的不同的路径从而具有不同的路径名。
1.在UNIX文件系统中每个目录还有一项指向该目录本身以及另一项指向该目录的父目录。因此,严格说来,UNX文件系统不是树,而是类树(treelike)
前序遍历(preorder traversal)。在前序遍历中,对结点的处理工作是在它的诸儿子结点被处理之前进行的。
另一种遍历树的常用方法是后序遍历(postorder traversal)在后序遍历中,在一个结点的工作是在它的诸儿子结点被计算后进行的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值