数据结构与算法分析(Java语言描述)学习--第六天
第4章 树
预备知识
一棵树是N个节点和N-1条边的集合,其中一个节点叫做根。
没有子节点的节点称为叶节点。
从节点1到节点2的路径的长为该路径上的边的条数。
任意节点的深度为从根到该节点的唯一路径的长。
节点的高是从该节点到一片树叶的最长路径的长。
一棵树的深度等于它的最深的树叶的深度,该深度总是等于这棵树的高。
树的实现
在每一个节点除数据外还要有一些链,使得该节点的每一个儿子都有一个链指向它。
将每个节点的所有儿子都放在树节点的链表中。
class TreeNode
{
Object element;
TreeNode firstChild;//第一儿子
TreeNode nextSibling;//下一兄弟
}
树的遍历及应用
先序遍历。在先序遍历中,对节点的处理工作是在它的儿子节点被处理之前进行的。
先访问根节点,然后遍历左子树,最后遍历右子树。
遍历左右子树时,仍然先访问根节点,然后遍历左右子树。
后序遍历。在后序遍历中,对节点的处理工作是在它的儿子节点被处理之后进行的。
先遍历左子树,然后遍历右子树,最后访问根节点。
遍历左右子树时,仍然先遍历左右子树,然后访问根节点。
二叉树
一棵树,每个节点都不能有多于两个的儿子。
一棵平均二叉树的深度要比节点个数N小得多。
实现
保存直接链接到它们的链。
class BinaryNode
{
Object element;
BinaryNode left;
BinaryNode right;
}
例子:表达式树
表达式树的树叶是操作数,其他节点是操作符。
中序遍历。中序遍历先遍历左子树,然后访问根节点,最后遍历右子树。
中缀表达式转换成后缀表达式:栈。遇到级别更低的运算符弹出。
构造表达式树
把后缀表达式转变为表达式树。
一次一个符号地读入表达式,如果符号是操作数,就建立一个单节点树并推入栈中。如果符号是操作符,就从栈中弹出两棵树并形成一棵新树,根就是操作符。
查找树ADT–二叉查找树
树中的每个节点,左子树中所有项的值小于节点中的项,右子树中所有项的值大于节点中的项。
contains方法
findMin和findMax方法
insert方法
remove方法
处理具有两个儿子的节点,用其右子树的最小数据代替该节点的数据,并递归删除那个节点。
懒惰删除:当一个元素要被删除时,仍留在树中,知识被标记为删除。
平均情况分析
一棵树的所有节点的深度的和称为内部路径长。