annotate src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/data/treemap/TreeMapNode.cs @ 2:a3af05a061b4

fix , but not work.
author Kazuma
date Fri, 01 Jul 2016 19:28:57 +0900
parents 5c58219da97e
children 224f0f8b4f40
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
1 using System.Collections;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
2 using System;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
3 using UnityEngine;
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
4 using System.Collections.Generic;
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
5
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
6
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
7 public abstract class TreeMapNode<K,V>
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
8 {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
9
2
a3af05a061b4 fix , but not work.
Kazuma
parents: 1
diff changeset
10 protected K key = default(K);
a3af05a061b4 fix , but not work.
Kazuma
parents: 1
diff changeset
11 protected V value = default(V);
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
12 public TreeMapNode<K,V> right;
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
13 public TreeMapNode<K,V> left;
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
14
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
15
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
16 // Use this for initialization
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
17 public TreeMapNode (K key, V value)
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
18 {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
19 this.key = key;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
20 this.value = value;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
21 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
22
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
23 public TreeMapNode (K key, V value, TreeMapNode<K,V> left, TreeMapNode<K,V> right)
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
24 {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
25 this.key = key;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
26 this.value = value;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
27 this.right = right;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
28 this.left = left;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
29 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
30
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
31 public virtual TreeMapNode<K,V> lefts ()
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
32 {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
33 return left;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
34 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
35
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
36
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
37 public int compare(K compareKey, Comparer<K> ctr) {
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
38 int val = (int) ctr.Compare (compareKey, this.getKey ());
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
39 return val;
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
40 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
41
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
42 public V get (K key, Comparer<K> ctr)
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
43 {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
44 TreeMapNode<K,V> cur = this;
2
a3af05a061b4 fix , but not work.
Kazuma
parents: 1
diff changeset
45 while (cur.isNotEmpty ()) { // getでEmpty nodeを返している ? compareでKeyが0になっている
a3af05a061b4 fix , but not work.
Kazuma
parents: 1
diff changeset
46 int result = cur.compare (key, ctr);
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
47 if (result > 0) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
48 cur = cur.rights ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
49 } else if (result < 0) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
50 cur = cur.lefts ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
51 } else if (result == 0) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
52 if (cur != null) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
53 return cur.getValue ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
54 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
55 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
56 }
2
a3af05a061b4 fix , but not work.
Kazuma
parents: 1
diff changeset
57 return default(V);
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
58 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
59
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
60
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
61
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
62 public virtual TreeMapNode<K,V> rights () {
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
63 return right;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
64 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
65
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
66 public K getKey () {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
67 return key;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
68 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
69
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
70 public V getValue () {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
71 return value;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
72 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
73
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
74 // may be to use Comparer??
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
75 public TreeMapNode<K,V> put (K k, V v,Comparer<K> ctr) {
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
76
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
77 if (!isNotEmpty ()) {
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
78 return createNode (k, v, left, right);
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
79 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
80
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
81 int result = compare (k, ctr);
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
82 if (result > 0) {
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
83 TreeMapNode<K,V> node = right.put (k, v, ctr);
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
84 node = createNode (key, this.value, left, node);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
85 return node.insBalance ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
86 } else if (result < 0) {
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
87 TreeMapNode<K,V> node = left.put (k, v,ctr);
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
88 return createNode (key, this.value, node, right).insBalance ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
89 }
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
90 return createNode (key, v, left, right);
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
91 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
92
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
93 public rebuildNode<K,V> delete (K key, TreeMapNode<K,V> parent, Comparer<K> ctr, Rotate side)
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
94 {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
95 if (this.isNotEmpty ()) {
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
96 rebuildNode<K,V> rebuildNode = null;
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
97 int result = compare(key, ctr);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
98 if (result > 0) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
99 rebuildNode = right.delete (key, this, ctr, Rotate.R);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
100 } else if (result < 0) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
101 rebuildNode = left.delete (key, this, ctr, Rotate.L);
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
102 } else if (result == 0){
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
103 rebuildNode = replaceNode (parent, ctr);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
104 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
105 if (parent == null) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
106 return rebuildNode;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
107 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
108 TreeMapNode<K,V> node = rebuildNode.getNode ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
109 if (rebuildNode.rebuilds ()) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
110 // ここのエラーは後で
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
111 return node.deleteBalance (parent, ctr);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
112 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
113 TreeMapNode<K,V> newParent;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
114 if (side == Rotate.L) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
115 newParent = parent.createNode (parent.getKey (), parent.getValue (), node, parent.rights ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
116 } else {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
117 newParent = parent.createNode (parent.getKey (), parent.getValue (), parent.lefts (), node);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
118 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
119 return new rebuildNode<K,V> (false, newParent);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
120 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
121 return null;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
122 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
123
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
124 public rebuildNode<K,V> deleteSubTreeMaxNode (TreeMapNode<K, V> parent, Comparer<K> ctr, Rotate side)
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
125 {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
126 rebuildNode<K,V> rebuildNode;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
127 TreeMapNode<K, V> node;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
128 if (rights ().isNotEmpty ()) {// 最大値のノードが取得できるまで潜る
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
129 rebuildNode = rights ().deleteSubTreeMaxNode (this, ctr, Rotate.R);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
130 } else {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
131 rebuildNode = this.replaceNode (parent, ctr);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
132 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
133 if (parent == null)
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
134 return rebuildNode;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
135
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
136 if (rebuildNode.rebuilds ()) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
137 node = rebuildNode.getNode ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
138 return node.deleteBalance (parent, ctr);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
139 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
140 if (side == Rotate.R)
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
141 node = parent.createNode (parent.getKey (), parent.getValue (), parent.lefts (), rebuildNode.getNode ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
142 else
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
143 node = parent.createNode (parent.getKey (), parent.getValue (), rebuildNode.getNode (), parent.rights ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
144 return new rebuildNode<K,V> (false, node);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
145 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
146
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
147
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
148 public rebuildNode<K, V> deleteBalance (TreeMapNode<K, V> parent, Comparer<K> ctr)
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
149 {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
150 TreeMapNode<K, V> newNode = null;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
151 if (!isRed ()) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
152 if (0 > compare (parent.getKey (), ctr)) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
153 bool rightChild = parent.lefts ().rights ().isRed ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
154 bool leftChild = parent.lefts ().lefts ().isRed ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
155
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
156 if (!parent.isRed ()) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
157 if (!parent.lefts ().isRed ()) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
158 if (!rightChild && !leftChild) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
159 newNode = rebuildThree (parent, Rotate.R);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
160 return new rebuildNode<K,V> (true, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
161 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
162 if (rightChild) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
163 newNode = rebuildfive (parent, Rotate.R);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
164 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
165 } else {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
166 newNode = rebuildsix (parent, Rotate.R);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
167 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
168 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
169 } else { // 左の子が赤
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
170 newNode = rebuildTwo (parent, ctr, Rotate.R);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
171 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
172 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
173 } else { // 親が赤
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
174 if (!rightChild && !leftChild) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
175 newNode = rebuildFour (parent, Rotate.R);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
176 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
177 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
178 if (rightChild) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
179 newNode = rebuildfive (parent, Rotate.R);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
180 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
181 } else {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
182 newNode = rebuildsix (parent, Rotate.R);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
183 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
184 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
185 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
186 } else {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
187 bool rightChild = parent.rights ().rights ().isRed ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
188 bool leftChild = parent.rights ().lefts ().isRed ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
189
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
190 if (!parent.isRed ()) { // 親が黒
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
191 if (!parent.rights ().isRed ()) { // 左の子が黒
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
192 if (!rightChild && !leftChild) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
193 newNode = rebuildThree (parent, Rotate.L);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
194 return new rebuildNode<K,V> (true, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
195 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
196 if (rightChild) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
197 newNode = rebuildsix (parent, Rotate.L);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
198 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
199 } else {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
200 newNode = rebuildfive (parent, Rotate.L);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
201 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
202 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
203 } else { // 左の子が赤
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
204 newNode = rebuildTwo (parent, ctr, Rotate.L);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
205 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
206 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
207 } else { // 親が赤
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
208 if (!rightChild && !leftChild) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
209 newNode = rebuildFour (parent, Rotate.L);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
210 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
211 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
212 if (rightChild) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
213 newNode = rebuildsix (parent, Rotate.L);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
214 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
215 } else {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
216 newNode = rebuildfive (parent, Rotate.L);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
217 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
218 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
219 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
220 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
221 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
222 if (0 > (compare (parent.getKey (), ctr))) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
223 newNode = parent.createNode (parent.getKey (), parent.getValue (), parent.lefts (), this);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
224 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
225 } else {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
226 newNode = parent.createNode (parent.getKey (), parent.getValue (), this, parent.rights ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
227 return new rebuildNode<K,V> (false, newNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
228 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
229 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
230
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
231 protected TreeMapNode<K, V> rebuildTwo (TreeMapNode<K, V> parent, Comparer<K> ctr, Rotate side)
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
232 { // case2
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
233 if (side == Rotate.L) { // rotate Left
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
234 TreeMapNode<K, V> node = parent.rights ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
235 TreeMapNode<K, V> leftSubTreeRoot = node.createNode (parent.getKey (), parent.getValue (), this, node.lefts ()); // check
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
236 rebuildNode<K, V> rebuildNode = new rebuildNode<K,V> (false, leftSubTreeRoot);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
237 rebuildNode<K, V> leftNodeRebuildNode = this.deleteBalance (rebuildNode.getNode (), ctr);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
238 TreeMapNode<K, V> rightNode = node.rights ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
239 return parent.createNode (node.getKey (), node.getValue (), leftNodeRebuildNode.getNode (), rightNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
240 } else { // rotate Right
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
241 TreeMapNode<K, V> node = parent.lefts ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
242 TreeMapNode<K, V> rightSubTreeRoot = node.createNode (parent.getKey (), parent.getValue (), node.rights (), this);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
243 rebuildNode<K, V> rightSubTreeRebuildNode = new rebuildNode<K,V> (false, rightSubTreeRoot);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
244 rebuildNode<K, V> rightNodeRebuildNode = this.deleteBalance (rightSubTreeRebuildNode.getNode (), ctr);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
245 TreeMapNode<K, V> leftNode = node.lefts ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
246 return parent.createNode (node.getKey (), node.getValue (), leftNode, rightNodeRebuildNode.getNode ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
247 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
248 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
249
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
250 protected TreeMapNode<K, V> rebuildThree (TreeMapNode<K, V> parent, Rotate side)
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
251 { // case3 再帰
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
252 if (side == Rotate.L) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
253 TreeMapNode<K, V> rightNode;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
254 if (parent.rights ().isNotEmpty ())
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
255 rightNode = new RedNode<K,V> (parent.rights ().getKey (), parent.rights ().getValue (), parent.rights ().lefts (), parent.rights ().rights ()); // check
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
256 else
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
257 rightNode = new EmptyNode<K,V> ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
258 return parent.createNode (parent.getKey (), parent.getValue (), this, rightNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
259 } else {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
260 TreeMapNode<K, V> leftNode;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
261 if (parent.lefts ().isNotEmpty ())
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
262 leftNode = new RedNode<K,V> (parent.lefts ().getKey (), parent.lefts ().getValue (), parent.lefts ().lefts (), parent.lefts ().rights ()); // check
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
263 else
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
264 leftNode = new EmptyNode<K,V> ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
265 return parent.createNode (parent.getKey (), parent.getValue (), leftNode, this);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
266 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
267 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
268
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
269 protected TreeMapNode<K, V> rebuildFour (TreeMapNode<K, V> parent, Rotate side)
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
270 { // case 4
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
271 if (side == Rotate.R) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
272 TreeMapNode<K, V> leftNode = new RedNode<K,V> (parent.lefts ().getKey (), parent.lefts ().getValue (), parent.lefts ().lefts (), parent.lefts ().rights ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
273 return new BlackNode<K,V> (parent.getKey (), parent.getValue (), leftNode, this);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
274 } else {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
275 TreeMapNode<K, V> rightNode = new RedNode<K,V> (parent.rights ().getKey (), parent.rights ().getValue (), parent.rights ().lefts (), parent.rights ().rights ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
276 return new BlackNode<K,V> (parent.getKey (), parent.getValue (), this, rightNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
277 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
278 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
279
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
280 protected TreeMapNode<K, V> rebuildfive (TreeMapNode<K, V> parent, Rotate side)
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
281 { // case5
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
282 if (side == Rotate.R) { // rotate Left
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
283 TreeMapNode<K, V> leftChild = new RedNode<K,V> (parent.lefts ().getKey (), parent.lefts ().getValue (), parent.lefts ().lefts (), parent.lefts ().rights ().lefts ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
284 TreeMapNode<K, V> rightChild = parent.lefts ().rights ().rights ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
285 TreeMapNode<K, V> leftSubTreeRoot = new BlackNode<K,V> (parent.lefts ().rights ().getKey (), parent.lefts ().rights ().getValue (), leftChild, rightChild);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
286 TreeMapNode<K, V> newParent = parent.createNode (parent.getKey (), parent.getValue (), leftSubTreeRoot, this);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
287 return this.rebuildsix (newParent, Rotate.R);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
288 } else { // rotate Right 修正済み
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
289 TreeMapNode<K, V> leftChild = parent.rights ().lefts ().lefts ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
290 TreeMapNode<K, V> rightChild = new RedNode<K,V> (parent.rights ().getKey (), parent.rights ().getValue (), parent.rights ().lefts ().rights (), parent.rights ().rights ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
291 TreeMapNode<K, V> rightSubTreeRoot = new BlackNode<K,V> (parent.rights ().lefts ().getKey (), parent.rights ().lefts ().getValue (), leftChild, rightChild);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
292 TreeMapNode<K, V> newParent = parent.createNode (parent.getKey (), parent.getValue (), this, rightSubTreeRoot);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
293 return this.rebuildsix (newParent, Rotate.L);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
294 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
295 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
296
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
297 protected TreeMapNode<K, V> rebuildsix (TreeMapNode<K, V> parent, Rotate side)
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
298 { // case6
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
299 if (side == Rotate.L) { // rotate Left
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
300 TreeMapNode<K, V> leftChild = parent.rights ().createNode (parent.getKey (), parent.getValue (), this, parent.rights ().lefts ()); // check
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
301 TreeMapNode<K, V> rightChild = new BlackNode<K,V> (parent.rights ().rights ().getKey (), parent.rights ().rights ().getValue (), parent.rights ().rights ().lefts (), parent.rights ().rights ().rights ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
302 return parent.createNode (parent.rights ().getKey (), parent.rights ().getValue (), leftChild, rightChild);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
303 } else { // rotate Right
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
304 TreeMapNode<K, V> leftChild = new BlackNode<K,V> (parent.lefts ().lefts ().getKey (), parent.lefts ().lefts ().getValue (), parent.lefts ().lefts ().lefts (), parent.lefts ().lefts ().rights ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
305 TreeMapNode<K, V> rightChild = parent.lefts ().createNode (parent.getKey (), parent.getValue (), parent.lefts ().rights (), this);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
306 return parent.createNode (parent.lefts ().getKey (), parent.lefts ().getValue (), leftChild, rightChild);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
307 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
308 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
309
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
310
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
311
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
312
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
313
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
314
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
315
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
316
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
317 public abstract bool isNotEmpty ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
318
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
319 public abstract TreeMapNode<K,V> createNode (K key, V value, TreeMapNode<K,V> left, TreeMapNode<K,V> right);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
320
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
321 public abstract TreeMapNode<K,V> insBalance ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
322
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
323
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
324 public abstract Rotate checkRotate (Rotate side);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
325
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
326 public abstract bool isRed ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
327
1
5c58219da97e fix code TreeMap
Kazuma
parents: 0
diff changeset
328 public abstract rebuildNode<K,V> replaceNode (TreeMapNode<K,V> parent, Comparer<K> ctr);
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
329
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
330 public abstract rebuildNode<K,V> deleteNode ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
331
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
332 // test method
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
333 public abstract int checkDepth (int count, int minCount);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
334 }