comparison 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
comparison
equal deleted inserted replaced
9:e6ad9016601c 10:abe0c247f5a5
1 using UnityEngine;
2 using System.Collections;
3 using System;
4 using System.Collections.Generic;
5
6 public class RedNode<K,V> : TreeMapNode<K,V>{
7
8 // Use this for initialization
9 public RedNode (K key, V value, TreeMapNode<K,V> left, TreeMapNode<K,V> right)
10 : base (key, value, left, right)
11 {
12 }
13
14 // Update is called once per frame
15 public override bool isNotEmpty ()
16 {
17 return true;
18 }
19
20 public override rebuildNode<K,V> deleteNode() {
21 TreeMapNode<K,V> emptyNode = new EmptyNode<K,V>(this.getKey());
22 return new rebuildNode<K,V>(false, emptyNode);
23 }
24
25 public override Rotate checkRotate(Rotate side) {
26 if (side == Rotate.L) {
27 if (left.isRed())
28 return Rotate.R;
29 else if (right.isRed())
30 return Rotate.LR;
31 return Rotate.N;
32 } else {
33 if (left.isRed())
34 return Rotate.RL;
35 else if (right.isRed())
36 return Rotate.L;
37 return Rotate.N;
38 }
39 }
40
41 public override rebuildNode<K,V> replaceNode(TreeMapNode<K, V> parent, Comparer<K> ctr) {
42 TreeMapNode<K, V> newNode;
43 if (!this.lefts().isNotEmpty() && !this.rights().isNotEmpty()) { //自身を削除する
44 return deleteNode();
45 } else if (this.lefts().isNotEmpty() && !this.rights().isNotEmpty()) { //左の部分木を昇格させる
46 newNode = lefts().createNode(lefts().getKey(), lefts().getValue(), lefts().lefts(), lefts().rights());
47 return new rebuildNode<K,V>(false, newNode);
48 } else if (!this.lefts().isNotEmpty() && this.rights().isNotEmpty()) { //右の部分木を昇格させる
49 newNode = rights().createNode(rights().getKey(), rights().getValue(), rights().lefts(), rights().rights());
50 return new rebuildNode<K,V>(false, newNode);
51 } else {//子ノードが左右にある場合
52 //左の部分木の最大の値を持つNodeと自身を置き換える
53 TreeMapNode<K, V> cur = this.lefts();
54
55 while (cur.rights().isNotEmpty()) {
56 cur = cur.rights();
57 }
58 if (this.lefts().rights().isNotEmpty()) {
59 rebuildNode<K, V> leftSubTreeNodeRebuildNode = this.lefts().deleteSubTreeMaxNode(null, ctr, Rotate.L);
60 if (leftSubTreeNodeRebuildNode.rebuilds()) {
61 TreeMapNode<K, V> node = leftSubTreeNodeRebuildNode.getNode();
62 TreeMapNode<K, V> newParent = createNode(cur.getKey(), cur.getValue(), node, this.rights());
63 return node.deleteBalance(newParent, ctr);
64 }
65 TreeMapNode<K, V> leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode();
66 newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.rights());
67 return new rebuildNode<K,V>(false, newNode);
68 } else {
69 rebuildNode<K, V> leftSubTreeNodeRebuildNode = this.lefts().replaceNode(this, ctr);
70 if (leftSubTreeNodeRebuildNode.rebuilds()) {
71 TreeMapNode<K, V> node = leftSubTreeNodeRebuildNode.getNode();
72 TreeMapNode<K, V> newParent = createNode(this.lefts().getKey(), this.lefts().getValue(), node, this.rights());
73 return node.deleteBalance(newParent, ctr);
74 }
75 TreeMapNode<K, V> leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode();
76 newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.rights());
77 return new rebuildNode<K,V>(false, newNode);
78 }
79
80 }
81 }
82
83 public override bool isRed() {
84 return true;
85 }
86
87 public override TreeMapNode<K, V> createNode(K key, V value, TreeMapNode<K, V> left, TreeMapNode<K, V> right) {
88 return new RedNode<K,V>(key, value, left, right);
89 }
90
91 public override TreeMapNode<K, V> insBalance() {
92 return this;
93 }
94
95 public override int checkDepth(int count, int minCount) { // test method
96 count++;
97 minCount = lefts().checkDepth(count, minCount);
98 minCount = rights().checkDepth(count, minCount);
99 return minCount;
100 }
101 }