二叉树的链式存储结构

由于二叉树的每个结点最多有两个儿子,因此存储二叉树的最自然的方法是链接的方法。在用链接方式存储二叉树时,对于每个结点,除了存储结点标号等信息外,还应设置指向结点左右儿子的指针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)时间内完成树的大部分操作,所以推荐使用这种方法表示树。

<script src="../../../lib/footer.js" type="text/javascript"> </script>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值