//===================================== // 関数 //------------------------------------- /// <summary> /// 新しい要素を木に追加します /// </summary> /// <param name="val">追加したい要素</param> public virtual void Add(System.IComparable val) { int cc = val.CompareTo(this.v); if (cc < 0) { if (this.lL == 0) { this.lL++; this.l = new binTreeNode(val, this, true); } else { l.Add(val); } } else { if (this.rL == 0) { this.rL++; this.r = new binTreeNode(val, this, false); } else { this.r.Add(val); } } }
/// <summary> /// このノードを木から削除します。このノードの下にある子孫は、木に残します。 /// </summary> public virtual void Remove() { if (lL + rL == 0) //子孫がない時 { this.p.Decreased(1, w); if (this.w) { this.p.l = null; } else { this.p.r = null; //自ら削除 } } else if (lL > rL) //左側の子孫の方が多い時 { v = l.lastNode.v; l.lastNode.Remove(); } else //右側の子孫の方が多い時 { v = r.firstNode.v; r.lastNode.Remove(); } }
// w,p を使用するロジックは、binTree で override されなければなりません。 //constructor /// <summary> /// mwg.Collection.binTreeNode のコンストラクタ /// </summary> /// <param name="val">保持する情報を設定します</param> /// <param name="parent">親となる binTreeNode を設定します</param> /// <param name="which">自分が左側の子かどうかを設定します。</param> public binTreeNode(System.IComparable val, binTreeNode parent, bool which) { v = val; p = parent; w = which; l = r = null; lL = rL = 0; }