介绍
二叉树(binary tree)是一棵树,其中每个节点都不能-有多余两个儿子。
二叉树的一个性质是平均二叉树的深度要比N小得多,这个性质有事很重要。分析表明,这个平均深度为,而对于特殊类型的二叉树,即二叉查找树(binary search tree),其深度的品均值是
。不幸的是这个深度也可以达到N-1的,即退化到单链表形式。
实现
二叉树最多有两个儿子,所以可以用指针直接指向他们。树结点的声明在结果上类似于双链表的声明,一个节点就是有Key(关键字)信息加上两个只想其他节点的指针(Left和Right)组成。
应用于链表上的许多法则也可以应用到书上,特别的,当进行一次插入时,必须调用malloc创建一个节点。节点可以在调用free删除后被释放。
表达式树
下图是表达式树(exmression tree)的例子。表达式树树叶是操作数(operand),比如常量或变量,而其他的节点为操作符(operator)。由于这里所有的操作都是二元的,因此这颗特定的树正好是二叉树,虽然这是最简单的情况,但是由于节点还是有可能含有多余两个儿子的。一个及诶单也有可能只有一个儿子,如具有一目减运算的情形。我们可以通过递归计算左子树和右子树所得到的值应用在根处的运算操作中而算出表达式树T的值。在下面例子中,左子树的值是”a+(b*c)”, 右子树的值是”((d*e)+f)*g”,因此整个树表示”(a+(b*c)+ ((d*e)+f)*g)”。
后序遍历:递归打印出左子树、右子树,然后打印运算符,则输出:”a b c * + d e * f + g * +”。
先序遍历:先打印出预算符,然后递归打印出右子树和左子树,则输出”+ + a * b c * + * d e f g”。
构造一颗表达式树
后缀表达式转化变成表达式树算法:一次一次地读入表达式,如果符号是操作符,那么就从栈中弹出只想两棵树T1和T2的那两个指针(T1的先弹出)并形成一颗新的树,该树的跟就是操作符,他的左、右分别指向T2和T1。然后将指向这棵树的指针压入栈中。
查找树——二叉查找树
假设树中的每个节点被指定一个关键字值,所有的关键字似乎互异的。
使二叉树成为查找二叉树的性质是,对于树中的每个节点X,它的左子树中,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字只大于X的关键字值。
1、 MakeEmpty
这个操作主要用于初始化。
2、 Find
这个操作一般需要返回指向树T中具有关键字Xde节点的指针,如果这样的节点不存在则返回NULL。树结构是得这种操作很简单。如果T是NULL,那么我们就可以返回NULL。否则,如果存储在T中的关键字是X,那么就可以返回T,否则,对树T的左子树或者右子树进行一次递归调用。
3、 FindMin和FindMax