using System; using System.Collections; using System.Collections.Generic; public class RedNode : TreeMapNode{ // Use this for initialization public RedNode (K key, V value, TreeMapNode left, TreeMapNode right) : base (key, value, left, right) { } // Update is called once per frame public override bool isNotEmpty () { return true; } public override rebuildNode deleteNode() { TreeMapNode emptyNode = new EmptyNode(this.getKey()); return new rebuildNode(false, emptyNode); } public override Rotate checkRotate(Rotate side) { if (side == Rotate.L) { if (left.isRed()) return Rotate.R; else if (right.isRed()) return Rotate.LR; return Rotate.N; } else { if (left.isRed()) return Rotate.RL; else if (right.isRed()) return Rotate.L; return Rotate.N; } } public override rebuildNode replaceNode(TreeMapNode parent, Comparer ctr) { TreeMapNode newNode; if (!this.lefts().isNotEmpty() && !this.rights().isNotEmpty()) { //自身を削除する return deleteNode(); } else if (this.lefts().isNotEmpty() && !this.rights().isNotEmpty()) { //左の部分木を昇格させる newNode = lefts().createNode(lefts().getKey(), lefts().getValue(), lefts().lefts(), lefts().rights()); return new rebuildNode(false, newNode); } else if (!this.lefts().isNotEmpty() && this.rights().isNotEmpty()) { //右の部分木を昇格させる newNode = rights().createNode(rights().getKey(), rights().getValue(), rights().lefts(), rights().rights()); return new rebuildNode(false, newNode); } else {//子ノードが左右にある場合 //左の部分木の最大の値を持つNodeと自身を置き換える TreeMapNode cur = this.lefts(); while (cur.rights().isNotEmpty()) { cur = cur.rights(); } if (this.lefts().rights().isNotEmpty()) { rebuildNode leftSubTreeNodeRebuildNode = this.lefts().deleteSubTreeMaxNode(null, ctr, Rotate.L); if (leftSubTreeNodeRebuildNode.rebuilds()) { TreeMapNode node = leftSubTreeNodeRebuildNode.getNode(); TreeMapNode newParent = createNode(cur.getKey(), cur.getValue(), node, this.rights()); return node.deleteBalance(newParent, ctr); } TreeMapNode leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode(); newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.rights()); return new rebuildNode(false, newNode); } else { rebuildNode leftSubTreeNodeRebuildNode = this.lefts().replaceNode(this, ctr); if (leftSubTreeNodeRebuildNode.rebuilds()) { TreeMapNode node = leftSubTreeNodeRebuildNode.getNode(); TreeMapNode newParent = createNode(this.lefts().getKey(), this.lefts().getValue(), node, this.rights()); return node.deleteBalance(newParent, ctr); } TreeMapNode leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode(); newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.rights()); return new rebuildNode(false, newNode); } } } public override bool isRed() { return true; } public override TreeMapNode createNode(K key, V value, TreeMapNode left, TreeMapNode right) { return new RedNode(key, value, left, right); } public override TreeMapNode insBalance() { return this; } public override int checkDepth(int count, int minCount) { // test method count++; minCount = lefts().checkDepth(count, minCount); minCount = rights().checkDepth(count, minCount); return minCount; } }