/ Vijos / 讨论 / 分享 /

大牛来救我啊!!!avl树的删除

那位大牛来救救我啊!!!

avl树的删除的pascal代码!!!

小弟膜拜

7 条评论

  • @ 2009-07-06 15:39:47

    orz

    orz

  • @ 2009-06-03 19:36:46

    orz一下

    orz

  • @ 2009-06-03 17:47:22

    orzAVL神牛

    rt

  • @ 2009-06-02 17:17:20

    AVL的删除

    其实AVL可以来锻炼代码能力和信心,毅力等。。。

    VJ上有1081喂狮子,郁闷的出纳员等都可用平衡树。

    我的AVL删除代码,大致思想是用这个节点的右子树的最小节点来代替此节点(如果存在的话)

    CODE:(x为要删除的节点地址,采用非递归编写,通过1081测试)

    procedure del ( x : link );

    var

    sld, srd, ld, rd : longint;

    lp, lv : link;

    begin

    lv := x;

    if lv^.r nil then begin

    lp := lv;

    lv := lv^.r;

    while lv^.l nil do lv := lv^.l;

    lp^.v := lv^.v;

    lp := lv^.p;

    if lv^.r = nil then

    if lp^.l = lv then lp^.l := nil else lp^.r := nil

    else begin

    lv^.r^.p := lp;

    if lp^.l = lv then lp^.l := lv^.r else lp^.r := lv^.r;

    end;

    end

    else if lv^.l nil then begin

    lp := lv^.p;

    if lp^.l = lv then lp^.l := lv^.l else lp^.r := lv^.l;

    lv^.l^.p := lp;

    end

    else begin

    lp := lv^.p;

    if lp^.l = lv then lp^.l := nil else lp^.r := nil;

    end;

    lp := lv^.p;

    dispose ( lv );

    if lp = avl then exit;

    while lp avl^.r do begin

    if lp^.l = nil then ld := 0 else ld := lp^.l^.dep;

    if lp^.r = nil then rd := 0 else rd := lp^.r^.dep;

    if ld > rd then lp^.dep := ld else lp^.dep := rd;

    inc ( lp^.dep );

    if abs ( ld - rd ) < 2 then begin

    lp := lp^.p;

    continue;

    end;

    if ld > rd then begin

    lv := lp^.l;

    if lv^.l = nil then sld := 0 else sld := lv^.l^.dep;

    if lv^.r = nil then srd := 0 else srd := lv^.r^.dep;

    if sld < srd then l_turn ( lv, lv^.r );

    lv := lp^.l;

    r_turn ( lp, lv );

    end

    else begin

    lv := lp^.r;

    if lv^.l = nil then sld := 0 else sld := lv^.l^.dep;

    if lv^.r = nil then srd := 0 else srd := lv^.r^.dep;

    if sld > srd then r_turn ( lv, lv^.l );

    lv := lp^.r;

    l_turn ( lp, lv );

    end;

    end;

    end;

    关于L_TURN和R_TURN,就是左右旋转,希望对你有帮助。

  • @ 2009-05-31 14:27:32

    SBT好方便,程序不比Treap长多少,请问一下VOJ上有那些题目要用到平衡树?

  • @ 2009-05-30 20:22:43

    .

    主观的说

    AVL不适合竞赛

  • @ 2009-05-30 19:49:29

    据说AVL的删除其烦无比,建议你去学SBT,高度也是严格logn,并且可以简单地删除结点。

  • 1