一:树的定义
树可以用几种方式定义。定义树的一种自然方式是递归的方法。一颗树是一些节点的集合,这个集合可以是空集,若非空,则一颗树由称作根的节点R以及0个或多个非空的树T1,T2...Tk组成,这些子树中没一颗的根都被来自根R的一条有向的边所连接。
树其实就是由N个节点和N-1条边组成,边在编程中大部分情况下由指针来描述。
实现树的一种方法可以是在每一个节点除数据外还要有一些指针,使得该节点的每一个儿子都有一个指针指向它,而每个节点的儿子是不确定的,这样会产生太多浪费空间。实际采用的方法是:将每个节点的所有儿子都放在树节点的链表中。让前一个兄弟指向下一个兄弟,这样便能找到所有的儿子。
Typedef struct TreeNode *ptrToNode;
Struct TreeNode
{
ElementType Element;
ptrToNode firstChild;
ptrToNode nextSibling;
};
二:树的应用
1.树流行的用法之一是包括UNIX,VAX/VMS和DOS在内的操作系统中的目录结构。
2.很多东西本身的结构就是树形的,如xml,html等,那么编写这些东西的解析器的时候,不可避免用到树。
3.树有个好处,就是当节点有序的时候(即有序树),那么在这个树上搜索一个节点是很快的(log级别),所以,现在的索引一般都是用各种树(数据库如mysql大多用B+树)。
4.在处理语法解析的时候,树也是不可或缺的数据结构,各种语言解析之后都是得到语法树,再做后续处理。等等。
三:树的类型
有二叉查找树,AVL树,红黑树,B-树,B+树,后缀树,广义后缀树,trie树。