为什么深度优先算法很重要?

148 阅读2分钟

深度优先算法(Deep First Search)是什么?

深度优先算法是为了遍历树结构的每个顶点的一种方案,对于树的每个节点而言,任意找一条路查找下去,直到这条路走不通,然后回溯到上一步,继续找其他的路查找下去,以此循环,创造了一个先触底,再一层一层返回的遍历方式.

我们使用DFS可以做什么

使用dfs可以遍历任何具有连接点,且节点间有指针指向关系的树结构

算法使用

最长同值路径

题目: 给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。

两个节点之间的路径长度 由它们之间的边数表示

class TreeNode {

    val: number

    left: TreeNode | null

    right: TreeNode | null

    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {

        this.val = (val===undefined ? 0 : val)

        this.left = (left===undefined ? null : left)

        this.right = (right===undefined ? null : right)

    }

}

题解

function longestUnivaluePath(root: TreeNode | null): number {
    let max = 0
    
    //返回结果应该为任何一个节点的最长路径
    function dfs(root: TreeNode | null){
        if(!root) return 0
        
        let left = dfs(root && root.left),right = dfs(root && root.right)
        let left1 = 0, right1 = 0;
        if(root.left && root.left.val === root.val) {
            left1 = left + 1
        }
        if(root.right && root.right.val === root.val) {
            right1 = right + 1
        }

        max = Math.max(max,right1+ left1)

        //因为是要两点之间的最长路径, 因此需要比较出子节点较长的长度
        return Math.max(left1,right1)
    }
    dfs(root)
    return max
};

总结

不知道一些没有算法基础的朋友是不是不很好理解, 这里我们使用了一个公共变量保存最长边.通过dfs算法计算出任何一个节点的最长路径,将这个最长路径经过dfs方法返回. 这里其实意味着,我们在任何一个节点的时候,都可以拿到这个节点的其中一个方向的最长路径, 通过把两个方向的最长路径进行相加, 得出两个方向的最大可能路径,然后赋值给我们的公共变量,进而得到第一个数节点的符合题目条件的最长路径. 为什么dfs算法很重要因为在处理一棵树的时候,我们可以很方便的使用dfs算法进行遍历, 由于dfs使用了递归算法的概念,递归算法拥有栈特点,弹出栈顶的方法就相当于dfs的退回上一层,很好的保留了遍历的节点状态. 因此dfs算法是我们在处理树时非常重要的算法概念.