annotate Main/jungle-main/data/treemap/RedNode.cs @ 35:f2ea780b3e80

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