File tree 7 files changed +66
-11
lines changed
7 files changed +66
-11
lines changed Original file line number Diff line number Diff line change 5
5
namespace spec \drupol \phptree \Exporter ;
6
6
7
7
use drupol \phptree \Exporter \Graph ;
8
- use drupol \phptree \Node \Node ;
9
8
use drupol \phptree \Node \ValueNode ;
10
9
use drupol \phptree \Traverser \BreadthFirst ;
11
10
use PhpSpec \ObjectBehavior ;
@@ -20,9 +19,9 @@ public function it_is_initializable()
20
19
public function it_can_generate_a_graph ()
21
20
{
22
21
$ root = new ValueNode ('root ' );
23
- $ child1 = new Node ();
24
- $ child2 = new Node ();
25
- $ child3 = new Node ();
22
+ $ child1 = new ValueNode ();
23
+ $ child2 = new ValueNode ();
24
+ $ child3 = new ValueNode ();
26
25
$ root
27
26
->add ($ child1 , $ child2 , $ child3 );
28
27
Original file line number Diff line number Diff line change @@ -25,7 +25,7 @@ public function it_can_export_to_an_array()
25
25
26
26
$ nodes = [];
27
27
foreach (\range ('A ' , 'J ' ) as $ value ) {
28
- $ nodes [$ value ] = new ValueNode ($ value );
28
+ $ nodes [$ value ] = new ValueNode ($ value, 2 );
29
29
}
30
30
31
31
$ tree ->add (...\array_values ($ nodes ));
Original file line number Diff line number Diff line change @@ -25,7 +25,7 @@ public function it_can_export_to_text()
25
25
26
26
$ nodes = [];
27
27
foreach (\range ('A ' , 'J ' ) as $ value ) {
28
- $ nodes [$ value ] = new ValueNode ($ value );
28
+ $ nodes [$ value ] = new ValueNode ($ value, 2 );
29
29
}
30
30
31
31
$ tree ->add (...\array_values ($ nodes ));
Original file line number Diff line number Diff line change @@ -237,7 +237,7 @@ public function it_can_get_its_depth()
237
237
238
238
$ nodes = [];
239
239
foreach (\range ('A ' , 'Z ' ) as $ v ) {
240
- $ nodes [] = new \drupol \phptree \Node \ValueNode ($ v );
240
+ $ nodes [] = new \drupol \phptree \Node \ValueNode ($ v, 2 );
241
241
}
242
242
243
243
$ tree ->add (...$ nodes );
Original file line number Diff line number Diff line change @@ -15,7 +15,7 @@ public function it_is_initializable()
15
15
$ this ->shouldHaveType (InOrder::class);
16
16
}
17
17
18
- public function it_can_traverse_a_tree ()
18
+ public function it_can_traverse_a_tree_of_degree2 ()
19
19
{
20
20
$ tree = new ValueNode ('root ' , 2 );
21
21
@@ -39,4 +39,50 @@ public function it_can_traverse_a_tree()
39
39
->traverse ($ tree )
40
40
->shouldYield (new \ArrayIterator ($ nodes ));
41
41
}
42
+
43
+ public function it_can_traverse_a_tree_of_degree4 ()
44
+ {
45
+ $ tree = new ValueNode ('root ' , 4 );
46
+
47
+ foreach (\range ('A ' , 'Z ' ) as $ key => $ value ) {
48
+ $ nodes [$ value ] = new ValueNode ($ value , 4 );
49
+ }
50
+
51
+ $ tree ->add (...\array_values ($ nodes ));
52
+
53
+ $ nodes ['root ' ] = $ tree ;
54
+ $ nodes = [
55
+ $ nodes ['U ' ],
56
+ $ nodes ['V ' ],
57
+ $ nodes ['E ' ],
58
+ $ nodes ['W ' ],
59
+ $ nodes ['X ' ],
60
+ $ nodes ['Y ' ],
61
+ $ nodes ['F ' ],
62
+ $ nodes ['Z ' ],
63
+ $ nodes ['A ' ],
64
+ $ nodes ['G ' ],
65
+ $ nodes ['H ' ],
66
+ $ nodes ['I ' ],
67
+ $ nodes ['J ' ],
68
+ $ nodes ['B ' ],
69
+ $ nodes ['K ' ],
70
+ $ nodes ['L ' ],
71
+ $ nodes ['root ' ],
72
+ $ nodes ['M ' ],
73
+ $ nodes ['N ' ],
74
+ $ nodes ['C ' ],
75
+ $ nodes ['O ' ],
76
+ $ nodes ['P ' ],
77
+ $ nodes ['Q ' ],
78
+ $ nodes ['R ' ],
79
+ $ nodes ['D ' ],
80
+ $ nodes ['S ' ],
81
+ $ nodes ['T ' ],
82
+ ];
83
+
84
+ $ this
85
+ ->traverse ($ tree )
86
+ ->shouldYield (new \ArrayIterator ($ nodes ));
87
+ }
42
88
}
Original file line number Diff line number Diff line change @@ -61,6 +61,7 @@ public function capacity(): int
61
61
public function add (NodeInterface ...$ nodes ): NodeInterface
62
62
{
63
63
foreach ($ nodes as $ node ) {
64
+ /** @var \drupol\phptree\Node\Node $parent */
64
65
$ parent = $ this ->findFirstAvailableNode ();
65
66
$ parent ->storage ['children ' ][] = $ node ->setParent ($ parent );
66
67
}
@@ -83,8 +84,14 @@ public function getTraverser()
83
84
*/
84
85
private function findFirstAvailableNode (): NodeInterface
85
86
{
87
+ $ capacity = $ this ->capacity ();
88
+
86
89
foreach ($ this ->getTraverser ()->traverse ($ this ) as $ node ) {
87
- if ($ node ->degree () >= $ node ->capacity ()) {
90
+ if (\method_exists ($ node , 'capacity ' )) {
91
+ $ capacity = $ node ->capacity ();
92
+ }
93
+
94
+ if ($ node ->degree () >= $ capacity ) {
88
95
continue ;
89
96
}
90
97
Original file line number Diff line number Diff line change @@ -31,8 +31,11 @@ public function traverse(NodeInterface $node): \Traversable
31
31
*/
32
32
private function doTraverse (NodeInterface $ node ): \Traversable
33
33
{
34
- foreach ($ node ->children () as $ child ) {
35
- if ($ node ->lastChild () === $ child ) {
34
+ $ countChildren = $ node ->degree ();
35
+ $ middle = \floor ($ countChildren /2 );
36
+
37
+ foreach ($ node ->children () as $ key => $ child ) {
38
+ if ((int ) $ key === (int ) $ middle ) {
36
39
yield $ this ->index => $ node ;
37
40
$ this ->index ++;
38
41
}
You can’t perform that action at this time.
0 commit comments