public Node(T arg) { level = 1; l = new Sentinel <T>(); r = new Sentinel <T>(); val = arg; }
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()); }
public IAATree <T> split() { if (level == r.r.level) { var R = r; r = R.l; R.l = this; R.level++; return(R); } return(this); }
/// <summary>レベルを下げて再平衡化 まだガワだけ</summary> /// <returns></returns> public IAATree <T> levelDown() { IAATree <T> ret = this; //葉のレベルは1 if (l.isSentinel() && r.isSentinel()) { level = 1; } //子と離れすぎていたら下げる return(ret); }
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()); }