annotate Main/jungle-main/data/treemap/BlackNode.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.Collections.Generic;
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;
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 BlackNode<K,V>
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
6 :TreeMapNode<K,V>
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
7 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
8
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
9 public BlackNode (K key, V value, TreeMapNode<K, V> left, TreeMapNode<K, V> right)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
10 : base (key, value, left, right)
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
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
14 public override rebuildNode<K,V> deleteNode ()
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 EmptyNode<K, V> emptyNode = new EmptyNode<K,V> (key);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
17 return new rebuildNode<K,V> (true, emptyNode);
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
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
20 public override int checkDepth (int count, int minCount)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
21 { // test method
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
22 count++;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
23 minCount = lefts ().checkDepth (count, minCount);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
24 minCount = rights ().checkDepth (count, minCount);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
25 return minCount;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
26 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
27
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
28 public override bool isNotEmpty ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
29 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
30 return true;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
31 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
32
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
33 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
34 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
35 return new BlackNode<K,V> (key, value, left, right);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
36 }
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 public override TreeMapNode<K, V> insBalance ()
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 Rotate spin = left.checkRotate (Rotate.L);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
41
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
42 if (spin == Rotate.R) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
43 TreeMapNode<K, V> leftChild = new BlackNode<K,V> (left.lefts ().getKey (), left.lefts ().getValue (), left.lefts ().lefts (), left.lefts ().rights ());
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
44 TreeMapNode<K, V> rightChild = new BlackNode<K,V> (getKey (), getValue (), left.rights (), right);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
45 return new RedNode<K,V> (left.getKey (), left.getValue (), leftChild, rightChild);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
46
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
47 } else if (spin == Rotate.LR) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
48 TreeMapNode<K, V> leftChild = new BlackNode<K,V> (left.getKey (), left.getValue (), left.lefts (), left.rights ().lefts ());
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
49 TreeMapNode<K, V> rightChild = new BlackNode<K,V> (getKey (), getValue (), left.rights ().rights (), right);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
50 return new RedNode<K,V> (left.rights ().getKey (), left.rights ().getValue (), leftChild, rightChild);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
51
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
52 }
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 spin = right.checkRotate (Rotate.R);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
55 if (spin == Rotate.L) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
56 TreeMapNode<K, V> leftChild = new BlackNode<K,V> (getKey (), getValue (), left, right.lefts ());
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
57 TreeMapNode<K, V> rightChild = new BlackNode<K,V> (right.rights ().getKey (), right.rights ().getValue (), right.rights ().lefts (), right.rights ().rights ());
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
58 return new RedNode<K,V> (right.getKey (), right.getValue (), leftChild, rightChild);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
59
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
60 } else if (spin == Rotate.RL) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
61 TreeMapNode<K, V> leftChild = new BlackNode<K,V> (getKey (), getValue (), left, right.lefts ().lefts ());
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
62 TreeMapNode<K, V> rightChild = new BlackNode<K,V> (right.getKey (), right.getValue (), right.lefts ().rights (), right.rights ());
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
63 return new RedNode<K,V> (right.lefts ().getKey (), right.lefts ().getValue (), leftChild, rightChild);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
64
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
65 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
66
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
67 return this;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
68 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
69
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
70 public override Rotate checkRotate (Rotate side)
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
71 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
72 return Rotate.N;
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
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
75 public override bool isRed ()
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
76 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
77 return false;
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 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
81 {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
82 TreeMapNode<K, V> newNode;
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
83 if (!this.lefts ().isNotEmpty () && !this.rights ().isNotEmpty ()) { //自身を削除する
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
84 return deleteNode ();//黒が1つ減るので木のバランスを取る
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
85 } else if (this.lefts ().isNotEmpty () && !this.rights ().isNotEmpty ()) { //左の部分木を昇格させる
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
86 newNode = createNode (lefts ().getKey (), lefts ().getValue (), lefts ().lefts (), lefts ().rights ());
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
87 if (!this.lefts ().isRed ()) //昇格させる木のrootが黒だったらバランスを取る
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
88 return new rebuildNode<K,V> (true, newNode);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
89 return new rebuildNode<K,V> (false, newNode);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
90 } else if (!this.lefts ().isNotEmpty () && this.rights ().isNotEmpty ()) { //右の部分木を昇格させる
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
91 newNode = createNode (rights ().getKey (), rights ().getValue (), rights ().lefts (), rights ().rights ());
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
92 if (!this.rights ().isRed ()) //昇格させる木のrootが黒だったらバランスを取る
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
93 return new rebuildNode<K,V> (true, newNode);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
94 return new rebuildNode<K,V> (false, newNode);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
95 } else {//子ノードが左右にある場合 二回目はここには入らない
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
96 //左の部分木の最大の値を持つNodeと自身を置き換える
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
97 TreeMapNode<K, V> cur = this.lefts ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
98 while (cur.rights ().isNotEmpty ()) { //左の部分期の最大値を持つNodeを取得する
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
99 cur = cur.rights ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
100 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
101 if (this.lefts ().rights ().isNotEmpty ()) { //左の部分木が右の子を持っているか
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
102 rebuildNode<K, V> leftSubTreeNodeRebuildNode = this.lefts ().deleteSubTreeMaxNode (null, ctr, Rotate.L);//最大値を削除した左の部分木を返す。rootはthisと同じ。
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
103 if (leftSubTreeNodeRebuildNode.rebuilds ()) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
104 TreeMapNode<K, V> leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
105 TreeMapNode<K, V> newParent = createNode (cur.getKey (), cur.getValue (), leftSubTreeNode, this.rights ());
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
106 return leftSubTreeNode.deleteBalance (newParent, ctr);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
107 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
108 //same name onece used.
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
109 TreeMapNode<K, V> leftSubTreeNodes = leftSubTreeNodeRebuildNode.getNode ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
110 newNode = createNode (cur.getKey (), cur.getValue (), leftSubTreeNodes, this.rights ()); //rootをcurと入れ替えることでNodeの削除は完了する
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
111 return new rebuildNode<K,V> (false, newNode);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
112 } else {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
113 rebuildNode<K, V> leftSubTreeNodeRebuildNode = this.lefts ().replaceNode (this, ctr);//右の子がいなかった場合、左の子を昇格させるだけで良い。
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
114 if (leftSubTreeNodeRebuildNode.rebuilds ()) {
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
115 TreeMapNode<K, V> node = leftSubTreeNodeRebuildNode.getNode ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
116 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
117 return node.deleteBalance (newParent, ctr);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
118 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
119 TreeMapNode<K,V> leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode ();
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
120 newNode = createNode (this.lefts ().getKey (), this.lefts ().getValue (), leftSubTreeNode, this.rights ());
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
121 return new rebuildNode<K,V> (false, newNode);
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
122 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
123 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
124 }
1f99e150f336 fix folder and add Object Mapper.
Kazuma Takeda
parents:
diff changeset
125 }