Mercurial > hg > Database > jungle-sharp
diff src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle-main/data/treemap/RedNode.cs @ 10:abe0c247f5a5
Add Network module. but, unComplete NetworkDefaultJungleTreeEditor.cs
author | Kazuma Takeda <kazuma-arashi@hotmail.co.jp> |
---|---|
date | Sun, 23 Oct 2016 07:40:50 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle-main/data/treemap/RedNode.cs Sun Oct 23 07:40:50 2016 +0900 @@ -0,0 +1,101 @@ +using UnityEngine; +using System.Collections; +using System; +using System.Collections.Generic; + +public class RedNode<K,V> : TreeMapNode<K,V>{ + + // Use this for initialization + public RedNode (K key, V value, TreeMapNode<K,V> left, TreeMapNode<K,V> right) + : base (key, value, left, right) + { + } + + // Update is called once per frame + public override bool isNotEmpty () + { + return true; + } + + public override rebuildNode<K,V> deleteNode() { + TreeMapNode<K,V> emptyNode = new EmptyNode<K,V>(this.getKey()); + return new rebuildNode<K,V>(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<K,V> replaceNode(TreeMapNode<K, V> parent, Comparer<K> ctr) { + TreeMapNode<K, V> 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<K,V>(false, newNode); + } else if (!this.lefts().isNotEmpty() && this.rights().isNotEmpty()) { //右の部分木を昇格させる + newNode = rights().createNode(rights().getKey(), rights().getValue(), rights().lefts(), rights().rights()); + return new rebuildNode<K,V>(false, newNode); + } else {//子ノードが左右にある場合 + //左の部分木の最大の値を持つNodeと自身を置き換える + TreeMapNode<K, V> cur = this.lefts(); + + while (cur.rights().isNotEmpty()) { + cur = cur.rights(); + } + if (this.lefts().rights().isNotEmpty()) { + rebuildNode<K, V> leftSubTreeNodeRebuildNode = this.lefts().deleteSubTreeMaxNode(null, ctr, Rotate.L); + if (leftSubTreeNodeRebuildNode.rebuilds()) { + TreeMapNode<K, V> node = leftSubTreeNodeRebuildNode.getNode(); + TreeMapNode<K, V> newParent = createNode(cur.getKey(), cur.getValue(), node, this.rights()); + return node.deleteBalance(newParent, ctr); + } + TreeMapNode<K, V> leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode(); + newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.rights()); + return new rebuildNode<K,V>(false, newNode); + } else { + rebuildNode<K, V> leftSubTreeNodeRebuildNode = this.lefts().replaceNode(this, ctr); + if (leftSubTreeNodeRebuildNode.rebuilds()) { + TreeMapNode<K, V> node = leftSubTreeNodeRebuildNode.getNode(); + TreeMapNode<K, V> newParent = createNode(this.lefts().getKey(), this.lefts().getValue(), node, this.rights()); + return node.deleteBalance(newParent, ctr); + } + TreeMapNode<K, V> leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode(); + newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.rights()); + return new rebuildNode<K,V>(false, newNode); + } + + } + } + + public override bool isRed() { + return true; + } + + public override TreeMapNode<K, V> createNode(K key, V value, TreeMapNode<K, V> left, TreeMapNode<K, V> right) { + return new RedNode<K,V>(key, value, left, right); + } + + public override TreeMapNode<K, V> 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; + } +}