永发信息网

用c实现avl树 完整代码 请问谁有吗 或者到哪里找

答案:2  悬赏:0  手机版
解决时间 2021-12-21 22:24
  • 提问者网友:听门外雪花风
  • 2021-12-21 16:59
用c实现avl树 完整代码 请问谁有吗 或者到哪里找
最佳答案
  • 五星知识达人网友:孤老序
  • 2021-12-21 17:17
AVL树插入算法的基本步骤如下:
①在寻找新结点的插入位置的过程中,记下离该位置最近、且平衡因子不等于零的结点a(此结点即为可能出现的最小失衡子树的根);
②修改自该结点至插入位置路径上所有结点的平衡因子(注意:树上其它结点的平衡因子均不受插入的影响);
③判断实施插入操作之后,结点a的平衡因子的绝对值是否大于1(即判断是否失衡)。若是,进一步判断失衡类型并做相应调整;否则插入过程结束。
仍以二叉链表作为AVL树的存储结构。但每个结点需增加一个域用于存储平衡因
子。类型定义如下:
type avlpt=^anode;
anode=record
key:keytype;
bf:-1..1;
lchild,rchild:avlpt;
...
end;
在此存储结构上,AVL树的插入算法如下:
procedure insert_avltree(K:keytype;var t:avlpt);
//在以T为根指针的AVL树上插入键值等于K的新结点//
begin
new(s);s^.key:=K;s^.lchild:=nil;s^.lchild:=nil;//生成以K为键值的新结点//
if t=nil
then t:=s //将新结点作为根结点插入空树//
else begin //4-10行:查找S^的插入位置,并记录a//
f:=nil;a:=t;p:=t;q:=nil;
while p<>nil do
[ if p^.bf<>0 then [a:=p;f:=p];
//a记录bf<>0的结点,其终值指向离插入位置最近的bf<>0的结点//
q:=p; //s^将插到q^上//
if s^.key<p^.key then p:=p^.lchild else p:=p^.rchild ];
if s^.key<q^.key then q^.lchild:=s else q^.rchild:=s; //插入s^//
if s^.key<a^.key
then [ p:=a^.lchild;b:=p; d:=1 ] //s^插在a^的左子树上,增量D为1//
else [ p:=a^.rchild;b:=p;d:=-1 ];//s^插在A^的右子树上,增量D为-1//
while p<>s do //修改自a^的孩子至S^路径上各结点的平衡因子//
if s^.key<p^.key //若S^在p^的左子树上//
then [ p^.bf:=1;p:=p^.lchild ]
//p^的平衡因子加工1—原来为O,因为p^是a^的子孙//
else [p^.bf:=-1;p:=p^.lchild]; //p^的平衡因子减1—原来为0//
case //判断是否失衡//
a^.bf=0: a^.bf:=d;
//找插入位置过程中未遇到bf<>0的结点,A指根树//
a^.bf+d=0: a^.bf:=0 //插入不导致以a^为根的子树失衡//
else //其它情况均失衡。差别失衡类型并调整//
[ if d=1
then case
b^.bf=1:LL-rotation;//LL型调整//
b^.bf=-1:LR-rotation//LR型调整,结束时令B指新子树的根//
end;
else case
b^.bf=-1:RR-rotation;
b^.bf=1:RL-rotation //结束时令b指新子树的根//
end;
case //将新子树链接到原a^的双亲f^上//
f=nil:t:=b;//原a^为树根//
f^.lchild=a:f^.lchild:=b;
f^.rchild=a:f^.rchild:=b
end ]
end
end;
二叉排序树(包括AVL树)适合于组织较小的、内存中能容纳的查找表。若查找表大得必须存放在外部存储器上,再用二叉排序树来表示就不合适了。对外存文件的组织来说,需考虑采用其他的数据结构(如B树和B+树)。
全部回答
  • 1楼网友:慢性怪人
  • 2021-12-21 18:22
avl树插入算法的基本步骤如下: ①在寻找新结点的插入位置的过程中,记下离该位置最近、且平衡因子不等于零的结点a(此结点即为可能出现的最小失衡子树的根); ②修改自该结点至插入位置路径上所有结点的平衡因子(注意:树上其它结点的平衡因子均不受插入的影响); ③判断实施插入操作之后,结点a的平衡因子的绝对值是否大于1(即判断是否失衡)。若是,进一步判断失衡类型并做相应调整;否则插入过程结束。 仍以二叉链表作为avl树的存储结构。但每个结点需增加一个域用于存储平衡因 子。类型定义如下: type avlpt=^anode; anode=record key:keytype; bf:-1..1; lchild,rchild:avlpt; ... end; 在此存储结构上,avl树的插入算法...s^;/:avlpt.key.lchild];p^的平衡因子加工1—原来为o.; ;p.bf=1;s do /、内存中能容纳的查找表; lchild:t;s^插在a^的左子树上:rr-rotation。类型定义如下: procedure insert_avltree(k。但每个结点需增加一个域用于存储平衡因 子;原a^为树根//.lchild ] /d:=a^:=p^;/p^; /.lchild; else [ p:=t:=s else q^; bf; f.rchild=a;/0的结点,进一步判断失衡类型并做相应调整;//,结点a的平衡因子的绝对值是否大于1(即判断是否失衡);s^;p.lchild else p;p,再用二叉排序树来表示就不合适了;若s^在p^的左子树上/:=a^;判断是否失衡/>s^将插到q^上/:=b:=nil:树上其它结点的平衡因子均不受插入的影响):=-1;否则插入过程结束;/.key<:lr-rotation/ else begin //.key /.bf+d=0; q; if s^:=k;>,a指根树/。差别失衡类型并调整//结束时令b指新子树的根/在以t为根指针的avl树上插入键值等于k的新结点/ /:=-1 ];/ b^;/ end:=nil; else [p^; if t=nil then t、且平衡因子不等于零的结点a(此结点即为可能出现的最小失衡子树的根);>: type avlpt=^anode,增量d为1/.bf.lchild;a: a^;/,rchild;将新结点作为根结点插入空树// begin new(s);a记录bf,结束时令b指新子树的根/p^;/:f^; f^;插入s^/:=1; a^; b^:=p^.lchild;/.bf< d:查找s^的插入位置;/.key<.key<.rchild;/4-10行:=p:=p^;/:=0 / /:=p; end:=p];var t;找插入位置过程中未遇到bf<.rchild;/ /q;/ then [ p^:=b end ] end end.bf=-1;/:=s /.bf=-1:=nil; ②修改自该结点至插入位置路径上所有结点的平衡因子(注意; [ if d=1 then case b^,并记录a/,记下离该位置最近; else case b^;b;/.1: a^;>/。若查找表大得必须存放在外部存储器上:=b; while p< f=nil; anode=record key.:avlpt).key then q^;s^;/,其终值指向离插入位置最近的bf [ if p^。 仍以二叉链表作为avl树的存储结构;p^的平衡因子减1—原来为0/ else /:=p。若是; 在此存储结构上;// /.lchild;f;/.lchild;/ case / if s^;其它情况均失衡:=d:f^;修改自a^的孩子至s^路径上各结点的平衡因子/> 二叉排序树(包括avl树)适合于组织较小的avl树插入算法的基本步骤如下;//.bf; a^;/。对外存文件的组织来说:=s:=nil..key then [ p;/0的结点/:=t;/ case //.bf;b:rl-rotation // if s^;/ ///. end.lchild=a:keytype:keytype;0 then [a.rchild,因为p^是a^的子孙/.key<,增量d为-1///.rchild ];lr型调整;/.bf=0:=p;>q^;ll型调整/生成以k为键值的新结点/:=1 ] /.bf=1; f^;//将新子树链接到原a^的双亲f^上/s^插在a^的右子树上;0的结点; while p<:ll-rotation;/ if s^;/.key then p;插入不导致以a^为根的子树失衡/:=p^.bf;/,需考虑采用其他的数据结构(如b树和b+树): ①在寻找新结点的插入位置的过程中,avl树的插入算法如下:-1; ③判断实施插入操作之后
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯