DFS
二叉树的最大深度
二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
var maxDepth = function(root) {
if(root == null){
return 0
}else{
let left=maxDepth(root.left)
let right=maxDepth(root.right)
return Math.max(left,right)+1
}
};
二叉树的最小深度
二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点
示例:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
var minDepth = function(root) {
if(root == null){
return 0
}
if(root.left == null && root.right == null){
return 1
}
let min_deep = Infinity
if(root.left != null){
min_deep=Math.min(minDepth(root.left),min_deep)
}
if(root.right != null){
min_deep=Math.min(minDepth(root.right),min_deep)
}
return min_deep+1
};
找到最终的安全状态
找到最终的安全状态
有一个有 n 个节点的有向图,节点按 0 到 n - 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示, graph[i]是与节点 i 相邻的节点的整数数组,这意味着从节点 i 到 graph[i]中的每个节点都有一条边。
如果一个节点没有连出的有向边,则它是 终端节点 。如果没有出边,则节点为终端节点。如果从该节点开始的所有可能路径都通向一个 终端节点 ,则该节点为 安全节点 。
返回一个由图中所有 安全节点 组成的数组作为答案。答案数组中的元素应当按 升序 排列。
输入:graph = [[1,2],[2,3],[5],[0],[5],[],[]]
输出:[2,4,5,6]
解释:示意图如上。
节点5和节点6是终端节点,因为它们都没有出边。
从节点2、4、5和6开始的所有路径都指向节点5或6。
var eventualSafeNodes = function(graph) {
let len=graph.length
// 标记数组
// 0:未访问
// 1:位于递归栈或环上
// 2:安全
let color=new Array(len).fill(0)
let res=[]
for(let i=0; i<len; i++){
if(safe(graph,color,i)){
res.push(i)
}
}
return res
function safe(graph,color,i){
if(color[i]>0){
return color[i] === 2
}
// 进来就标记,这是因为可能存在环,
// 如果我们进来就标记了,后面出现重复遍历的时候,
// 因为我们是用DFS,所以我们就知道该节点是在一个环路中的
color[i] = 1
for(let x of graph[i]){
// 判断是否有一条路径不能到达终端节点,只要有一条不满足就直接返回false
if(!safe(graph,color,x)){
return false
}
}
color[i] = 2
return true
}
};
矩阵中的最长递增路径
矩阵中的最长递增路径
给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。
输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4
解释:最长递增路径为 [1, 2, 6, 9]。