由于二叉树的每个结点最多有两个儿子,因此存储二叉树的最自然的方法是链接的方法。在用链接方式存储二叉树时,对于每个结点,除了存储结点标号等信息外,还应设置指向结点左右儿子的指针LeftChild和RightChild。结点的类型说明为:
Type TPosition=^NodeType; NodeType=record Label:LabelType; LeftChild,RightChild:TPosition; end; TreeType=TPosition; |
若用游标来模拟指针,可用一数组来存储二叉树的所有结点,并对此数组作如下说明:
Type TPosition=integer; NodeType=record Label:LabelType; LeftChild,RightChild:TPosition; end; TreeType=TPosition; var Sellsapce:array [1..MaxNodeCount] of NodeType; {cellspace用来存储结点单元} |
例如,图9(a)中二叉树,用指针实现的二叉链表和用游标实现的二叉链表分别如图10(a)和(b)所示。
(a)
(b)
图10 二叉树的链式存储结构
若经常要在二叉树中进行Parent操作,可在每个结点上再加一个指向其父结点的指针Parent,形成一个带父亲指针的二叉链表,或称其为一个三叉链表。
三叉链表的类型定义如下:
Type TPosition=^NodeType; NodeType=record Label:LabelType; Parent,LeftChild,RightChild:TPosition; end; TreeType=TPosition; |
若用游标来模拟指针,可用一数组来存储二叉树的所有结点,并对此数组作如下说明:
Type TPosition=integer; NodeType=record Label:LabelType; Parent,LeftChild,RightChild:TPosition; end; TreeType=TPosition; var Cellspace:array [1..MaxNodeCount] of NodeType;{cellspace用来存储结点} |
下面我们就针对三叉链表讨论ADT二叉树基本操作的实现。请注意,下面的三叉链是用指针实现的,用游标实现的三叉链与此类似。
三叉链表实现ADT二叉树基本操作
函数 Parent(v,T); 功能
实现
说明
复杂性
|
函数 Left_Child(v,T); 功能
实现
说明
复杂性
|
函数 Right_Child(v,T); 功能
实现
说明
复杂性
|
函数 Create(x,Left,Right,T); 功能
实现
说明
复杂性
|
可以看到,使用这种三叉链表示树,能在O(1)时间内完成树的大部分操作,所以推荐使用这种方法表示树。
<script src="../../../lib/footer.js" type="text/javascript"> </script>