annotate src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/RedBlackTreeTraverser.java @ 308:201cc75a9984

change Red Black Tree Edit Path Extends
author tatsuki
date Thu, 26 Jan 2017 15:23:25 +0900
parents
children 2a0cb1f0ba4e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
308
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
1 package jp.ac.u_ryukyu.ie.cr.jungle.traverser;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
2
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
3 import jp.ac.u_ryukyu.ie.cr.jungle.core.Children;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
4 import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
5 import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
6 import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
7 import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
8 import jp.ac.u_ryukyu.ie.cr.jungle.util.Error.Error;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
9
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
10 import java.util.Iterator;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
11
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
12 public class RedBlackTreeTraverser implements Traverser {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
13 @Override
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
14 public Either<Error, Traversal> traverse(final TreeNode root, Evaluator evaluator) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
15 Either<Error, List<Direction<TreeNode>>> ret = _traverse(root, evaluator, -1);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
16
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
17 if (ret.isA()) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
18 return DefaultEither.newA(ret.a());
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
19 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
20
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
21 List<Direction<TreeNode>> list = ret.b();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
22
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
23 final Iterable<Direction<TreeNode>> iterable = list;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
24 final TreeNode destination = ret.b().head().getTarget();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
25
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
26 Traversal traversal = new Traversal() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
27 @Override
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
28 public Iterator<Direction<TreeNode>> iterator() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
29 return iterable.iterator();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
30 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
31
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
32 @Override
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
33 public TreeNode destination() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
34 return destination;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
35 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
36 };
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
37
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
38 return DefaultEither.newB(traversal);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
39 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
40
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
41 private Either<Error, List<Direction<TreeNode>>> _traverse(TreeNode currentNode, Evaluator _evaluator, int pos) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
42 Evaluation e = _evaluator.evaluate(currentNode, pos);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
43 Result r = e.result();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
44 if (r == Result.LEFT) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
45 return left(currentNode, pos, e.evaluator());
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
46 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
47
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
48 if (r == Result.RIGHT) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
49 return right(currentNode, pos, e.evaluator());
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
50 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
51
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
52 if (r == Result.GOAL) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
53 return DefaultEither.newB(_goal(currentNode, pos));
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
54 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
55
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
56
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
57 return DefaultEither.newA(TraverserError.UNDEFINED_OPERATOR);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
58 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
59
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
60 private List<Direction<TreeNode>> _goal(final TreeNode _current, final int _pos) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
61 Direction<TreeNode> d = new Direction<TreeNode>() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
62 @Override
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
63 public int getPosition() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
64 return _pos;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
65 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
66
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
67 @Override
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
68 public TreeNode getTarget() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
69 return _current;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
70 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
71 };
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
72
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
73 List<Direction<TreeNode>> list = new List();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
74 List<Direction<TreeNode>> newList = list.addLast(d);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
75
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
76 return newList;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
77 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
78
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
79 private <T extends TreeNode> Either<Error, List<Direction<TreeNode>>> left(final T _current, final int _pos, Evaluator _evaluator) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
80 Children children = _current.getChildren();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
81 TreeNode child = children.at(0).b();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
82 Either<Error, List<Direction<TreeNode>>> either = _traverse(child, _evaluator, 0);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
83 if (either.isA()) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
84 return either;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
85 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
86
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
87 List<Direction<TreeNode>> list = either.b();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
88 Direction<TreeNode> d = new Direction<TreeNode>() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
89 @Override
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
90 public int getPosition() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
91 return _pos;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
92 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
93
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
94 @Override
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
95 public T getTarget() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
96 return _current;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
97 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
98 };
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
99
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
100 List<Direction<TreeNode>> newList = list.addLast(d);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
101 return DefaultEither.newB(newList);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
102 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
103
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
104 private <T extends TreeNode> Either<Error, List<Direction<TreeNode>>> right(final T _current, final int _pos, Evaluator _evaluator) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
105 Children children = _current.getChildren();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
106 TreeNode child = children.at(1).b();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
107 Either<Error, List<Direction<TreeNode>>> either = _traverse(_current, _evaluator, 1);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
108 if (either.isA()) {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
109 return either;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
110 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
111
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
112 List<Direction<TreeNode>> list = either.b();
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
113 Direction<TreeNode> d = new Direction<TreeNode>() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
114 @Override
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
115 public int getPosition() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
116 return _pos;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
117 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
118
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
119 @Override
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
120 public T getTarget() {
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
121 return _current;
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
122 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
123 };
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
124
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
125 List<Direction<TreeNode>> newList = list.addLast(d);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
126 return DefaultEither.newB(newList);
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
127 }
201cc75a9984 change Red Black Tree Edit Path Extends
tatsuki
parents:
diff changeset
128 }