【问题标题】:Tree iteration without recursion没有递归的树迭代
【发布时间】:2018-08-26 15:48:30
【问题描述】:

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

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 但它没有清除任何内容。 也许有人有更好的教程或任何建议?

【问题讨论】:

  • 对我来说像家庭作业
  • 我不是要求完整的解决方案,我要求的是方向、来源或只是回答这两个问题
  • 制作一个堆栈你必须处理的所有项目。添加您的“主”项目。如果您当前扫描的项目有子项,请将它们推入堆栈。重复直到堆栈为空。

标签: php recursion iteration


【解决方案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);
    }
  }
}

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

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

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 2019-12-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2022-11-11
    • 2012-10-17
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多