目录
3.查找树--二叉查找树(binary search tree)
4.AVL树(Adelson-Velsky-Landis Tree )
1.一般的树(tree)
定义:
一棵树是是N个节点和N-1条边的集合,其中的一个节点叫做根。
任意节点的深度为从跟到该节点的唯一路径的长。一棵树的深度等于它的最深的树叶的深度。
任意节点的高是从该节点到一片树叶的最长路径的长。一棵树的高等于它的根的高。树的深度等于树的高。
实现:
每个节点除数据外,有一个指针指向该节点的第一个儿子,另一个指针指向该节点的下一个兄弟。
typedef struct ThreeNode *PtrToNode;
struct TreeNode
{
ElementType Element;
PtrToNode FirstChild;
PtrToNode NextSibling;
}
树的遍历:
先序遍历(preorder traversal):先处理根节点,然后处理左右儿子。(使用:操作系统的目录结构)
中序遍历(Inorder traversal):先处理左儿子,在处理根节点,最后处理右儿子。(使用:计算表达式树)
后续遍历(postorder traversal):先处理左右左右儿子,然后处理根节点。(使用:计算文件目录的大小)
注:先序,中序,后续中的先、中、后是对于根而言的。
2.二叉树(binary tree)
定义:
二叉树是一棵树,其中每个节点都不能有多于两个的儿子。
实现:
节点由数据,和两个指向左右儿子的指针构成。
typedef struct ThreeNode *PtrToNode;
typedef struct ThreeNode *Tree;
struct TreeNode
{
ElementType Element;
Tree Left;
Tree Right;
}
应用:
表达式树:树叶是操作数(常量和变量),其他节点是操作符(+-*/)。
3.查找树--二叉查找树(binary search tree)
定义:
对于树中的每个节点X,它的左子树中所有关键字小于X的关键字,它的右子树中所有关键字大于X的关键字。
操作:
MakeEmpty()
Find()
FindMin()
FindMax()
Insert()
Delete()
二叉查找树,任意节点的期望深度为O(logN)
上述操作的平均运行时间都是O(logN)
4.AVL树(Adelson-Velsky-Landis Tree )
定义:
AVL树是带有平衡条件的二叉查找树,其每个节点的左子树和右子树的高度最多差1。
单旋转(single rotation):
对X节点的左儿子的左子树进行一次插入;
对X节点的右儿子的右子树进行一次插入。
双旋转(double rotation):
对X节点的左儿子的右子树进行一次插入;(先右旋转再左旋转)
对X节点的右儿子的左子树进行一次插入。(先左旋转再右旋转)
5.伸展树(splay tree)
定义:
一种放弃平衡条件,允许树有任意深度的自调整(self-adjusting)树。
当一个节点被访问后,它就要经过一系列AVL树的旋转被放到根上。
它保证从空树开始任意连续M次对树的操作最多花费O(MlogN)时间。一棵伸展树每次操作的摊还代价是O(logN)
展开:
- 之字形(zig-zag):
双旋转
- 一字型(zig-zig):
左右树变换。
6.树的遍历
- 按照排序的顺序列出所有的关键字(中序遍历):
void PrintTree(SearchTree T)
{
if(T!=NULL)
{
PrintTree(T->Left);
PrintElement(T->Element);
PrintTree(T->Right);
}
}
- 计算一个节点的高度(后续遍历):
int Height(Tree T)
{
if(T==NULL)
return -1;
else
return 1+Max(Height(T->Left),Height(T->Right));
}
- 先序遍历:
利用节点深度标志每一个节点。
- 层序遍历(level-order tracersal):
所有深度为D的节点要再深度为D+1的节点之前处理。(使用队列实现)
7.B-树(B-tree)
定义:
阶为M的B-树,
树的根或者是一片树叶,或者其儿子数再2和M之间。
除根外,所有非树叶节点的儿子数在[M/2]和M之间。
所有的树叶都在相同的深度上。
所有的数据存储在树叶上。
在每一个内部节点上皆含有指向该节点各儿子指针P1,P2.....PM
在每一个内部节点上皆含有代表子树P1,P2.....PM中发现的最小关键字的值k1,k2......km
对于每一节点,其子树P1中所有关键字都小于子树P2的关键字,依次类推。
在非根数叶中关键字的个数也在[M/2]和M之间。
应用:
数据库系统。