深度优先算法(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算法是我们在处理树时非常重要的算法概念.