如果输入数据量过大,链表的线性时间消耗显然不适合。所以人们引入一种新的抽象数据类型 (ADT) 树,树结构大部分操作的运行时间平均为O(logN)。下图就是一个具体的树其中节点 A 称作根(root), 节点 D 有一个父节点 A 和两个子节点 H,I;没有子节点的的节点称作“叶”(leaf),具有相同父节点的称作“兄弟”(sibling)。很容易证明一个数的两个不同节点只能存在一条路径链接彼此。
综上所述,对照链表的实现方式,实现“树”的结构,每个节点不仅要存储数据,还要有两个指针指向兄弟节点或者子节点:
typedef struct TreeNode *PtrToNode;
struct TreeNode
{
ElementType Element;
PtrToNode FirstChild;
PtrToNode NextSibling;
}
在这种定义下,上图的“树”可以表示为如下所示:
其中箭头代表指针,蓝色的箭头表示(FirstChild),黑色的箭头表示(NextSibling)。
一般UNIX,DOS等操作系统的文件目录就是一种树结构。