微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DFS 递归空间使用 PHP

如何解决DFS 递归空间使用 PHP

由于数组在 PHP 中不被视为对象,我必须手动引用它们以便递归填充数组或不断从递归调用中复制新创建/填充的数组。

"return" myRecursiveFunc() 不是一个选项,因为这会在错误的时间结束函数

一种方式:引用

public function depthFirstSearchInorder()
{
   $list = []; //otherwise PHP screams that only variables can be referenced (inside traverseInorder) 
   //Otherwise I would have passed an empty [] as second parameter
   return traverseInorder($this->root,$list);
}

function traverseInorder($node,&$list)
{
   if ($node->left) {
      traverseInorder($node->left,$list);
   }

   $list[] = $node->value;

   if ($node->right) {
      traverseInorder($node->right,$list);
   }

   return $list;
}

第二种方式:创建/复制数组

public function depthFirstSearchInorder()
{
   return traverseInorder($this->root);
}

function traverseInorder($node,$list = [])
{
   if ($node->left) {
      $list = traverseInorder($node->left,$list);
   }

   $list[] = $node->value;

   if ($node->right) {
      $list = traverseInorder($node->right,$list);
   }
   return $list;
}

第二种方式不会占用更多空间吗? 我正在为每个递归调用创建新数组,然后在 $list 中再次复制。

或者我现在只是一头雾水?

如果我要遍历这棵树

//            9,//       4,20       
//    1,6,15   170

使用第二种方式

  1. 我会从 9 开始
  2. 向左走并调用递归(因为 4)
  3. 向左走并调用递归(因为 1)
  4. 我用 1 填充我的空数组并返回数组 [1]
  5. 我回到值 4,我现在分配给 $list = [1](现在是 [1] 的副本,不是引用,对吗?所以数组 [1] 之后仍然存在于某处?
  6. 立>
  7. 我在数组 [1,4] 中推入 4 并向右走(因为 6)
  8. 我将 6 推入数组 [1,4,6] 并返回此数组 [1,6]
  9. 我回到值 4,我现在分配给 $list = [1,6](现在是 [1,6] 的副本,不是引用,对吗?所以数组 [1,6] 在某处之后仍然存在吗?

诸如此类……

回到我的问题:

第二种方式不是更占用空间吗?还是我现在只是一头雾水?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。