签到

05月06日
尚未签到

共有回帖数 0

    李小主任

    等级:
    Arne Andersson tree(AA Tree) 是一种平衡二叉搜索树,它其实是如下附加条件的 Red-Black Tree,红色结点必须是其 parent 的 right child。

    template typename T
    class AATree
    {
    public:
       AATree()
       {
           nullnode = new node;
           nullnode-lchild = nullnode;
           nullnode-rchild = nullnode;
           root = nullnode;
       }
       ~AATree()
       {
           Clear();
           delete nullnode;
       }
       void Clear()
       {
           Clear(root);
       }
       void Delete(const T &key)
       {
           Delete(root, key);
       }
       void Insert(const T &key)
       {
           Insert(root, key);
       }
    private:
       struct node
       {
           T key;
           int level;
           node *lchild, *rchild;
           node() : level(0) {}
           node(const T &key) : key(key), level(1) {}
       }*nullnode, *root;
       void Clear(node *root);
       void Delete(node *&root, const T &key);
       void Insert(node *&root, const T&key);
       void LeftRotate(node *&root)
       {
           node *p = root-rchild;
           root-rchild = p-lchild;
           p-lchild = root;
           root = p;
       }
       void RightRotate(node *&root)
       {
           node *p = root-lchild;
           root-lchild = p-rchild;
           p-rchild = root;
           root = p;
       }
       void Skew(node *&root)
       {
           if (root-lchild-level == root-level)
               RightRotate(root);
       }
       void Split(node *&root)
       {
           if (root-rchild-rchild-level == root-level)
           {
               LeftRotate(root);
               ++root-level;
           }
       }
    };

    template typename T
    void AATreeT::Clear(node *root)
    {
       if (root != nullnode)
       {
           Clear(root-lchild);
           Clear(root-rchild);
           delete root;
       }
    }
    template typename T
    void AATreeT::Delete(node *&root, const T &key)
    {
       static node *deletednode = nullnode, *lastnode;
       if (root == nullnode)
           return;
       lastnode = root;
       if (key  root-key)
           Delete(root-lchild, key);
       else
       {
           deletednode = root;
           Delete(root-rchild, key);
       }
       if (root == lastnode)
       {
           if (deletednode == nullnode || deletednode-key != key)
               return;
           deletednode-key = root-key;
           deletednode = nullnode;
           root = root-rchild;
           delete lastnode;
       }
       else if (root-lchild-level  root-level-1 || root-rchild-level  root-level-1)
       {
           if (root-rchild-level  --root-level)
               root-rchild-level = root-level;
           Skew(root);
           Skew(root-rchild);
           Skew(root-rchild-rchild);
           Split(root);
           Split(root-rchild);
       }
    }

    template typename T
    void AATreeT::Insert(node *&root, const T &key)
    {
       if (root == nullnode)
       {
           root = new node(key);
           root-lchild = nullnode;
           root-rchild = nullnode;
           return;
       }
       Insert(key  root-key ? root-lchild : root-rchild, key);
       Skew(root);
       Split(root);
    }

    楼主 2016-06-09 09:20 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知