comparison src/treecms/tree/util/PreorderTreewalker.java @ 3:5fa718b63cd5

finished treecms.memory basic implementation ( not tested yet. )
author shoshi
date Fri, 18 Feb 2011 02:14:10 +0900
parents
children 12604eb6b615
comparison
equal deleted inserted replaced
2:4a5ee88f02cf 3:5fa718b63cd5
1 package treecms.tree.util;
2
3 import java.util.Iterator;
4 import java.util.Stack;
5 import treecms.api.Node;
6
7 public class PreorderTreewalker implements Iterable<Node>
8 {
9 private Node m_root;
10
11 public PreorderTreewalker(Node _root)
12 {
13 m_root = _root;
14 }
15
16
17 @Override
18 public Iterator<Node> iterator()
19 {
20 return new IteratorImpl();
21 }
22
23 private class IteratorImpl implements Iterator<Node>
24 {
25 private Stack<Pair<Node,Iterator<Node>>> m_depth;
26 private Node m_next;
27
28 public IteratorImpl()
29 {
30 m_depth = new Stack<Pair<Node,Iterator<Node>>>();
31 m_next = m_root;
32 m_depth.add(new Pair<Node,Iterator<Node>>(m_next,m_next.getData().list().iterator())); // ワケがわからないよ!
33 }
34
35 @Override
36 public boolean hasNext()
37 {
38 return (m_next != null) ? true : false;
39 }
40
41 @Override
42 public Node next()
43 {
44 Node next = m_next;
45
46 //forward.
47 Pair<Node,Iterator<Node>> context = m_depth.peek();
48 Iterator<Node> itr = context.m_right;
49 if(itr.hasNext()){
50 m_next = itr.next();
51 m_depth.add(new Pair<Node,Iterator<Node>>(m_next,m_next.getData().list().iterator())); // ワケがわからないよ!
52 }else{
53 m_depth.pop();
54 while(!m_depth.isEmpty()){
55 Pair<Node,Iterator<Node>> back = m_depth.peek();
56 if(back.m_right.hasNext()){
57 m_next = back.m_right.next();
58 break;
59 }
60 m_depth.pop();
61 }
62 m_next = null;
63 }
64
65 return next;
66 }
67
68 @Override
69 public void remove()
70 {
71 //not supported.
72 }
73 }
74
75 private class Pair<L,R>
76 {
77 @SuppressWarnings("unused")
78 public L m_left;
79 public R m_right;
80
81 public Pair(L _left,R _right)
82 {
83 m_left = _left;
84 m_right = _right;
85 }
86 }
87 }