算法笔记-分支界限法

  (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 }

猜你喜欢

转载自www.cnblogs.com/wangjianheng/p/12578967.html