二叉树的链式存储结构
来源:互联网 发布:unity3d 骰子 编辑:程序博客网 时间:2024/05/18 15:07
由于二叉树的每个结点最多有两个儿子,因此存储二叉树的最自然的方法是链接的方法。在用链接方式存储二叉树时,对于每个结点,除了存储结点标号等信息外,还应设置指向结点左右儿子的指针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);
功能
这是一个求父结点的函数,函数值为树T中结点v的父亲。当v是根结点时,函数值为∧,表示结点v没有父结点。
实现
Function Parent(v:TPosition;var T:TreeType);
begin
return(v^.Parent);
end;
说明
直接返回v的父结点指针。
复杂性
O(1)
函数 Left_Child(v,T);
功能
这是一个求左儿子结点的函数。函数值为树T中结点v的左儿子。当结点v没有左儿子时,函数值为∧。
实现
Function Left_Child(v:TPosition;var T:TreeType):TPosition;
begin
return(v^.LeftChild);
end;
说明
直接返回v的左儿子指针。
复杂性
O(1)。
函数 Right_Child(v,T);
功能
这是一个求右儿子结点的函数。函数值为树T中结点v的右儿子。当结点v没有右儿子时,函数值为∧。
实现
Function Right_Child(v:TPosition;var T:TreeType):TPosition;
begin
return(v^.RightChild);
end;
说明
直接返回v的右儿子指针。
复杂性
O(1)。
函数 Create(x,Left,Right,T);
功能
这是一个建树过程。该函数生成一棵新的二叉树T,T的根结点标号为x,左右儿子分别为Left和Right。
实现
Procedure Create(x:LabelType;var Left,Right,T:TreeType);
begin
new(T);
T^.Label:=x;
T^.LeftChild:=Left;
T^.RightChild:=Right;
T^.Parent:=nil;
Left^.Parent:=T;
Right^.Parent:=T;
end;
说明
先生成一个标号为x的新结点,作为新树的根结点,然后修改其左右儿子指针,分别指向Left和Right,同时修改Left和Right的父亲指针,使其指向T。
复杂性
O(1)。
可以看到,使用这种三叉链表示树,能在O(1)时间内完成树的大部分操作,所以推荐使用这种方法表示树。
- 二叉树的链式存储结构
- 二叉树的链式存储结构
- 二叉树的链式存储结构
- 二叉树的链式存储结构-二叉链表
- 二叉树的链式存储结构----二叉链表
- 二叉树的链式存储结构 C++代码实现
- 二叉树的链式存储结构及基本操作
- 二叉树的链式结构。
- 二叉树的链式结构
- 二叉树的链式结构
- 二叉树的链式结构
- 二叉树的链式存储
- 二叉树的链式存储
- 二叉树的链式存储
- 二叉树的链式存储
- 二叉树的链式存储
- 二叉树的链式存储
- 二叉树的链式存储
- 中国软件不行论
- 二叉树的顺序存储结构
- 中国历史上的神秘事件
- 二叉树的结点度表示法
- 走近 STL
- 二叉树的链式存储结构
- 线索二叉树
- 二叉树的数学性质
- web2.0到底是什么?
- 特殊形态的二叉树
- 收集的一些robocup链接
- Python基础
- 果园或森林的二叉树表示
- 调用Calendar.js的html例子