没有递归的树迭代

时间:2018-03-17 17:48:25

标签: php recursion iteration

所以,我试图打印我的课程:

class category {

  public $name;
  public $id;
  public $subCats = array();

  public function __construct($name = "", $id = "") {
    $this->name = $name;
    $this->id = $id;
  }

  public function add_sub_cat($subCat) {
    array_push($this->subCats, $subCat);
  }

}

以递归和迭代两种方式,首先我没有遇到任何问题:

function recursive_print($category, $path) {
  ?>
    <li><div id="category-name" ><p><? echo $category->name ?></p>
              </div></li>
      <?php foreach($category->subCats as $subCat) { ?>
      <ul>
        <?php recursive_print($subCat, $path.=$subCat->id) ?>
      </ul>
    <?php }
}

但现在我被困在这项任务的第二部分。 我必须修改我的班级吗? 甚至可以在没有递归的情况下打印吗? 我读过this但它没有清除任何内容。 也许有人有更好的教程或任何建议?

1 个答案:

答案 0 :(得分:1)

在没有递归的情况下走树是一个有趣的问题。

基本思路是你需要自己跟踪堆栈。 (函数调用是通过在调用之前将临时变量和返回地址压入堆栈,然后弹出返回地址来实现的,所以当你做一个递归函数时,你自己就不必自己做了。)

这是一个非递归实现:

function tree_print($root_category) {
  $stack = array(array($root_category));
  echo '<ul>'."\n";
  while (count($stack)) {
    $category = array_shift($stack[count($stack)-1]);
    echo '<li><div id="category-name"><p>' . $category->name . '</p></div></li>'."\n";
    echo '<ul>'."\n";
    $stack[] = $category->subCats;
    while (count($stack) && count($stack[count($stack)-1]) == 0) {
      echo '</ul>'."\n";
      array_pop($stack);
    }
  }
}

在主循环的每次迭代中,我们将第一个树节点从堆栈顶部的数组中移出,打印它,打开一个<ul>标记,并将其所有子节点的数组推送到堆栈节点。然后,我们从堆栈顶部删除任何空数组,为每个这样的空数组关闭一个<ul>标记。

看到它在这里运行:https://3v4l.org/umpvf