(1)广度优先
说明:

代码:
1 <?php
2
3 $arr = [
4 'A' => [
5 'B' => [
6 'D' => ['H', 'I'],
7 'E' => ['J'],
8 'F',
9 ],
10 'C' => ['G'],
11 ],
12 ];
13
14 //直接用数组遍历
15 //print_R(bfsArr($arr));
16
17
18 //先将数组转成树, 再遍历
19 //$tree = current(buildTree($arr));
20 //$queue = [$tree->val];
21 //print_r(bfsObj([$tree]));
22
23
24 function bfsArr($queue) {
25 static $res;
26 $val = key($queue);
27 $out = array_shift($queue);
28 if (is_array($out)) {
29 $res[] = $val;
30 $queue = array_merge($queue, $out);
31 } else {
32 $res[] = $out;
33 }
34
35 if (!empty($queue)) {
36 bfsArr($queue);
37 }
38 return $res;
39 }
40
41 function bfsObj($queue) {
42 static $res;
43 $out = array_shift($queue);
44 $res[] = $out->val;
45 $queue = array_merge($queue, $out->nodes);
46
47 if (!empty($queue)) {
48 bfsObj($queue);
49 }
50 return $res;
51 }
52
53
54 function buildTree($arr) {
55 $ret = array();
56 if (is_array($arr)) {
57 foreach ($arr as $k => $v) {
58 if (is_numeric($k)) {
59 $tree = nodeFactory($v);
60 } else {
61 $tree = nodeFactory($k);
62 $tree->nodes = buildTree($v);
63 }
64 $ret[] = $tree;
65 }
66 } else {
67 return nodeFactory($arr);
68 }
69 return $ret;
70 }
71
72
73 function nodeFactory($val) {
74 $node = new stdClass();
75 $node->val = $val;
76 $node->nodes = array();
77 return $node;
78 }
来源:https://www.cnblogs.com/wangjianheng/p/12578967.html