Пример #1
0
 public Node(T arg)
 {
     level = 1;
     l     = new Sentinel <T>();
     r     = new Sentinel <T>();
     val   = arg;
 }
Пример #2
0
        public IAATree <T> delete(T arg)
        {
            if (!this.has(arg))
            {
                return(this);
            }
            IAATree <T> ret = this;

            if (arg.CompareTo(val) < 0)
            {
                l = l.delete(arg);
            }
            if (arg.CompareTo(val) > 0)
            {
                r = r.delete(arg);
            }
            if (arg.CompareTo(val) == 0)
            {
                //子が両方sentinelなら(=葉)自分をsentinelに置き換え
                //sentinelなのでレベル操作などは不要でreturn
                if (l.isSentinel() && r.isSentinel())
                {
                    return(new Sentinel <T>());
                }
                //子が片方しか居なければその子をかわりに接続
                if (l.isSentinel())
                {
                    ret = r;
                }
                if (r.isSentinel())
                {
                    ret = l;
                }

                //子が両方いるなら右をたどって一番左を連れてくる
                var tmp = r;
                if (tmp.l.isSentinel())
                {
                    //自分の右の子に左の子が居なければ付け替えて終了
                    tmp.l = this.l;
                    ret   = tmp;
                }
                else
                {
                    //sentinelに出くわすまで左向きにたどる
                    while (!tmp.l.l.isSentinel())
                    {
                        tmp = tmp.l;
                    }
                    //tmp.lを切り離してthisの位置に持ってくる
                    ret       = tmp.l;
                    tmp.l     = tmp.l.r;
                    ret.l     = this.l;
                    ret.r     = this.r;
                    ret.level = level;
                }
            }
            return(ret.levelDown());
        }
Пример #3
0
 public IAATree <T> split()
 {
     if (level == r.r.level)
     {
         var R = r;
         r   = R.l;
         R.l = this;
         R.level++;
         return(R);
     }
     return(this);
 }
Пример #4
0
        /// <summary>レベルを下げて再平衡化 まだガワだけ</summary>
        /// <returns></returns>
        public IAATree <T> levelDown()
        {
            IAATree <T> ret = this;

            //葉のレベルは1
            if (l.isSentinel() && r.isSentinel())
            {
                level = 1;
            }
            //子と離れすぎていたら下げる

            return(ret);
        }
Пример #5
0
 public IAATree <T> insert(T arg)
 {
     if (this.has(arg))
     {
         return(this);
     }                                             //データの重複を許さない
     if (val.CompareTo(arg) > 0)
     {
         l = l.insert(arg);
     }
     else
     {
         r = r.insert(arg);
     }
     return(this.pull().skew().split());
 }