(或关系),迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推
的方法来完成;
过程控制:在什么时候结束迭代过程2这是编写迭代程序必须考虑的问题。不能让
迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所
需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。
对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后
一种情况,需要进一步分析出用来结束迭代过程的条件。
中序表达式转后序表达式
卡塔兰数
队列(queue)也是一种受限的线性表,其元素只能从队尾插入(enqueue)以
及从队首删除(dequeue)。队列别称为 FIFO(First In First Out)线性表。
假设有一个含有 个元素的顺序队列(1)3),需要区分满队列和空
队列的状态。如果固定 的值,则 应该有 # 种不同的取值来区分 # 中状态。
但实际上 只有 种可能的取值,除非为空队列发明一种特殊情形。鸽笼原理:给定
个鸽笼和 # 只鸽子,当所有的鸽子都进入笼里时,可确信至少一个鸽笼中的鸽子数大于
#4故使用 和 的相对值,# 种状态必定有两种不能区分。一种方法是记录队列
中元素的个数,或至少用一个布尔变量来指示队列是否为空;另一种方法是设置数组的大
小为 #,但只存储 个元素。
链式队列(3)的实现只是对链表的实现做了简单的修改。若实现方法
没有表头结点,需在队列函数中单独处理插入到空队列的特殊情形,以及 3 函数
导致的空队列的特殊情形。从本质上将, 3 只是简单地把新元素放到链表尾部
( 指向的结点),然后修改 指针指向新的链表结点;3 指示简单地去掉
表中最前面一个结点并修改 指针。
实现顺序队列和链式队列的所有成员函数都需要常数时间,空间比较问题与栈实现类
似。只是,顺序队列不想顺序栈那样,不能在一个数组中存储两个队列,除非总有数据项
从一个队列转入另一个队列。在顺序队列中存储变长记录的方式与顺序栈中的方式相同。
双端队列(1333)。
第 5 章 二叉树
一棵二叉树(binary tree)由结点(node)的有限集合组成,这个集合或者为
空(empty),或者由一个根结点(root)以及两棵不相交的二叉树组成,这两棵二叉
树分别称为这个根的左子树(left subtree)和右子树(right subtree)。这两棵子
树的根称为此二叉树根结点的子结点(children);从一个结点到其两个子结点都有边
(edge)相连,这个结点称为其子结点的父结点(parent)。
如果一棵树有一串结点 #,$,444,,且 是 # 的父结点(#565),
则 #,$,444, 称为一条有 # 到 的路径(path),其长度为 1#。有一条路径
从 结 点 0 至 结 点 7 , 则 0 称 为 7 的 祖 先 ( ancestor ) , 7 称 为 0 的 子 孙
(descendant)。
结点 7 的深度(depth)就是从根结点到 7 的路径的长度。任何深度为