每日一题 -- 树
1325.删除给定值的叶子节点
1325.删除给定值的叶子节点
分析
- 首先这道题是要删除多个叶子节点,只要删除某个叶子节点,它原先的父节点也有可能符合要求而被删除
- 所以,这道题还是搜索然后删除的问题,需要用到自底向上的查询,因此要用后序遍历
- 由于这里搜查到叶子节点并符合要求后,需要删除当前节点,为了不用考虑是父节点的左右节点问题, dfs 的时候直接返回两种情况的值即可
- 如果符合删除要求,就返回 null,否则返回自身
- 这样自底向上,不断删除符合要求的及节点,直到遍历结束,返回根节点即可。
var removeLeafNodes = function(root, target) {
const dfs=(root) => {
if(!root) return null
root.left = dfs(root.left)
root.right = dfs(root.right)
if(!root.left&&!root.right && root.val === target){
return null
}
return root
}
return dfs(root)
};
91算法 -- 搜索
地图分析
1162. 地图分析
分析
- 求的是海洋距离陆地最近距离最大的那一批海洋,所以从陆地出发,不断逼近那一批可能不和陆地接壤的海洋
- 每一次都将陆地的上下左右都改造成陆地,防止重复操作,改造的次数就是需要求得的值
- 注意第一批 BFS 遍历的是原始的陆地队列,所以 steps 全局变量从 -1开始,第一次遍历的时候自增成 0
- 需要注意的是,只有在地图中的海洋改造地才能进入后续的队列中,且全是陆地和全是海洋的情况要判断
var maxDistance = function(grid) {
const n = grid.length
const queue = []
for(let i=0;i<n;i++){
for(let j=0;j<n;j++){
if(grid[i][j] === 1){
queue.push([i,j])
}
}
}
if(queue.length === 0 || queue.length === n**2) return -1
let steps = -1
while(queue.length){
let len = queue.length
while(len--){
const [x,y] = queue.shift()
const arr = [[x-1,y],[x+1,y],[x,y-1],[x,y+1]]
arr.forEach(item => {
const [i,j] = item
if(i>=0 && i<n&&j>=0&&j<n&&grid[i][j] ===0){
queue.push([i,j])
grid[i][j] = -1
}
})
}
steps+=1
}
return steps
};