📜  dfs 算法输出 (1)

📅  最后修改于: 2023-12-03 15:14:40.794000             🧑  作者: Mango

DFS算法介绍

DFS全称Depth First Search,翻译成中文是深度优先搜索,是图论中的经典算法。它从一个源节点开始,沿着一条路径一直走到无法走为止,然后回溯到上一个节点,再选择另外一条路径继续走下去,直到所有节点都已被访问过为止。

如何实现DFS算法?

DFS算法可以使用递归或非递归的方式实现。下面我们以二叉树的遍历作为例子,来演示DFS算法的实现过程。

递归实现DFS算法
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def dfs(self, root: TreeNode):
        if not root:
            return
        print(root.val)
        self.dfs(root.left)
        self.dfs(root.right)

我们首先定义一个二叉树节点的类TreeNode,它包括节点的值、左子树和右子树;接着我们定义DFS算法的类Solution,其中dfs是递归实现的DFS算法。在dfs函数中,当节点为空时,直接返回;否则输出节点的值,然后递归调用左子树和右子树的dfs函数。

非递归实现DFS算法
class Solution:
    def dfs(self, root: TreeNode):
        if not root:
            return
        stack = [root]
        while stack:
            node = stack.pop()
            print(node.val)
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)

我们在dfs函数中使用一个栈stack来储存节点,先将根节点入栈。在循环中,每次弹出栈顶元素node,然后输出节点的值。接着,我们将node的右子树和左子树入栈,注意这里要先添加右子树,再添加左子树,因为栈是先进后出的,我们需要保证左子树先被访问。

总结

DFS算法是一种基于栈或递归实现的图遍历算法。它的局限性是可能会陷入死循环或无限递归,因此需要特殊处理,例如使用visited数组储存已经访问过的节点。在解题时,我们可以根据具体问题,选择递归或非递归方式实现DFS算法,一定要注意边界条件的判断和栈的使用。