在深度优先搜索中实现显式堆栈

时间:2013-03-09 21:08:33

标签: php algorithm recursion graph depth-first-search

我有一个特别大的图表,因为它使用了过多的内存,所以几乎不可能使用递归进行遍历。

下面是我的深度优先函数,使用递归:

public function find_all_paths($start, $path)
{
    $path[] = $start;
    if (count($path)==25) /* Only want a path of maximum 25 vertices*/ {
        $this->stacks[] = $path;
        return $path;

    }
    $paths = array();

    for($i = 0; $i < count($this->graph[$start])-1; $i++) {
        if (!in_array($this->graph[$start][$i], $path)) {
     $paths[] = $this->find_all_paths($this->graph[$start][$i], $path);

        }
    }


    return $paths;
}

我想重写这个函数,因此它是非递归的。我假设我需要创建某种类型的队列,并使用array_shift()弹出值,但是在函数的哪个部分,以及如何确保排队的顶点被保留(将最终路径放在{ {1}})?

1 个答案:

答案 0 :(得分:1)

它不占用指数空间,树中的路径数等于叶数,每个叶只有一条从根开始的路径。

这是DFS对任意二叉树的简单搜索:

// DFS: Parent-Left-Right
public function dfs_search ( $head, $key )
{
    var $stack = array($head);
    var $solution = array();

    while (count($stack) > 0)
    {
        $node = array_pop($stack);

        if ($node.val == $key)
        {
            $solution[] = $node;
        }

        if ($node.left != null)
        {
            array_push($stack, $node.left);
        }

        if ($node.right != null)
        {
            array_push($stack, $node.right);
        }
    }

    return $solution;
}

你需要找到树中的所有路径只是分支&amp;分叉,意思是无论何时分支,每个分支都获取当前路径的副本。这里是一个1行递归分支&amp;我写道:

// Branch & Fork
public function dfs_branchFork ( $node, $path )
{
    return array($path)
        +($node.right!=null?dfs_branchFork($node.right, $path+array($node)):null)
        +($node.left!=null?dfs_branchFork($node.left, $path+array($node)):null);
}