zoukankan      html  css  js  c++  java
  • Splay旋转四步走

    1、标记新根

    root:=f[p].lch;
    

    2、将新根的左/右节点接到旧根的右/左节点上

    //====== 左旋 ======
    f[p].rch:=f[root].lch;
    f[f[p].rch].fa:=p;
    //====== 右旋 ======
    f[p].lch:=f[root].rch;
    f[f[p].lch].fa:=p;
    

    3、改写新根与其父亲之间的关系

    if p<>h then if f[f[p].fa].lch=p then f[f[p].fa].lch:=root else f[f[p].fa].rch:=root else h:=root;
    f[root].fa:=f[p].fa;
    

    4、标记新根和旧根之间的关系

    //====== 左旋 ======
    f[root].lch:=p;
    f[p].fa:=root;
    //====== 右旋 ======
    f[root].rch:=p;
    f[p].fa:=root;
    

    用指针写时注意null的判断。如果需要更新信息(节点数)在最后要同步更新p和root。

    附完整代码:

    Procedure zig(P:longint);
    var
     root:longint;
      begin
      root:=f[p].rch;
      if p<>h then if f[f[p].fa].lch=p then f[f[p].fa].lch:=root else f[f[p].fa].rch:=root else h:=root;
      f[root].fa:=f[p].fa;
      f[p].rch:=f[root].lch;
      f[f[p].rch].fa:=p;
      f[root].lch:=p;
      f[p].fa:=root;
      pushup(p);
      pushup(root);
    end;
    
    Procedure zag(P:longint);
    var
     root:longint;
      begin
      root:=f[p].lch;
      if p<>h then if f[f[p].fa].lch=p then f[f[p].fa].lch:=root else f[f[p].fa].rch:=root else h:=root;
      f[root].fa:=f[p].fa;
      f[p].lch:=f[root].rch;
      f[f[p].lch].fa:=p;
      f[root].rch:=p;
      f[p].fa:=root;
      pushup(p);
      pushup(root);
    end;
    
  • 相关阅读:
    使用 requests 维持会话
    使用 requests 发送 POST 请求
    使用 requests 发送 GET 请求
    requests 安装
    使用 urllib 分析 Robots 协议
    使用 urllib 解析 URL 链接
    使用 urllib 处理 HTTP 异常
    使用 urllib 处理 Cookies 信息
    使用 urllib 设置代理服务
    按单生产程序发布
  • 原文地址:https://www.cnblogs.com/htfy/p/2983425.html
Copyright © 2011-2022 走看看