-
Notifications
You must be signed in to change notification settings - Fork 2
/
TreeTraversal.java
140 lines (115 loc) · 3.05 KB
/
TreeTraversal.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
131
132
133
134
135
136
137
138
139
140
// Iterator pattern using binary tree in-order traversal
package behavioral.iterator;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.function.Consumer;
class Node<T>
{
public T value;
public Node<T> left, right, parent;
public Node(T value) {
this.value = value;
}
public Node(T value, Node<T> left, Node<T> right) {
this.value = value;
this.left = left;
this.right = right;
left.parent = right.parent = this;
}
}
class InOrderIterator<T> implements Iterator<T>
{
private Node<T> current, root;
private boolean yieldedStart; // whether we yielded starting element
public InOrderIterator(Node<T> root) {
this.root = current = root;
while(current.left != null)
current = current.left; // set current to left-most leaf
}
private boolean hasRightMostParent(Node<T> node)
{
if(node.parent == null) return false;
else
{
return (node == node.parent.left)
|| hasRightMostParent(node.parent);
}
}
@Override
public boolean hasNext() {
return current.left != null
|| current.right != null
|| hasRightMostParent(current);
}
@Override
public T next() {
if (!yieldedStart)
{
yieldedStart = true;
return current.value;
}
if (current.right != null)
{
current = current.right;
while (current.left != null)
current = current.left;
return current.value;
}
else
{
Node<T> p = current.parent;
while (p != null && current == p.right)
{
current = p;
p = p.parent;
}
current = p;
return current.value;
}
}
}
class BinaryTree<T> implements Iterable<T>
{
private Node<T> root;
public BinaryTree(Node<T> root) {
this.root = root;
}
@Override
public Iterator<T> iterator() {
return new InOrderIterator<>(root);
}
@Override
public void forEach(Consumer<? super T> action) {
// As you use the for loop, the for loop uses the iterator yielded
// from the iterator() method.
for(T item : this)
action.accept(item);
}
// @Override
// public Spliterator<T> spliterator() {
// return null;
// }
}
class TreeTraversalDemo
{
public static void main(String[] args) {
// 1
// / \
// 2 3
// Traversal = 213
Node<Integer> root = new Node<>(1,
new Node<>(2),
new Node<>(3));
InOrderIterator<Integer> it = new InOrderIterator<>(root);
// While loop
while(it.hasNext())
{
System.out.print(""+it.next()+",");
}
System.out.println();
BinaryTree<Integer> tree = new BinaryTree<>(root);
for (int n : tree)
System.out.print("" + n + ",");
System.out.println();
}
}