-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTreeIterator.java
130 lines (109 loc) · 3.27 KB
/
TreeIterator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package net.posick.tree;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Stack;
public class TreeIterator<T extends Tree<T, V>, V> implements Iterator<T>
{
private Stack<T> stack = new Stack<T>();
private boolean recursive;
private boolean siblings;
private T currentNode;
private T ignoreNode;
public TreeIterator(T node, boolean recursive, boolean siblings, T ignore)
{
currentNode = node;
this.recursive = recursive;
this.siblings = siblings;
this.ignoreNode = ignore;
}
/**
* @see java.util.Iterator#remove()
*/
public void remove()
{
currentNode.remove();
}
/**
* @see java.util.Iterator#hasNext()
*/
public boolean hasNext()
{
if (currentNode != null)
{
if (currentNode == ignoreNode)
{
currentNode = currentNode.getNextSibling();
}
return currentNode != null;
} else
{
return false;
}
}
/**
* @see java.util.Iterator#next()
*/
public T next()
{
T temp = null;
if (currentNode != null)
{
temp = currentNode;
if (recursive)
{
if (currentNode.getFirstChild() != null)
{
stack.push(currentNode);
currentNode = currentNode.getFirstChild();
} else if (currentNode.getNextSibling() != null)
{
if (stack.size() > 0)
{
currentNode = currentNode.getNextSibling();
} else
{
if (siblings)
{
currentNode = currentNode.getNextSibling();
} else
{
currentNode = null;
}
}
} else
{
currentNode = null;
while (stack.size() > 0 && currentNode == null)
{
currentNode = stack.pop();
if (stack.size() > 0)
{
currentNode = currentNode.getNextSibling();
} else
{
if (siblings)
{
currentNode = currentNode.getNextSibling();
} else
{
currentNode = null;
}
}
}
}
} else
{
currentNode = currentNode.getNextSibling();
}
// If we are supposed to ignore this node get next node.
if (temp == ignoreNode)
{
temp = next();
}
} else
{
throw new NoSuchElementException();
}
return temp;
}
}