30 天刷题挑战(十五)

题目来源: LeetCode 75 30 天 JavaScript 挑战

2705. 精简对象

思路

递归每一项,遇到真值放到结果里面。

代码

js 复制代码
function compactObject(obj) {
   if (obj === null || typeof obj !== "object") {
     return obj
   } 

  if (Array.isArray(obj)) {
    const res = []

    for(let item of obj) {
      const val = compactObject(item)
      if (val) {
        res.push(val)
      }
    } 
    
    return res
  }
  
  const res = {}
  
  Object.keys(obj).forEach(key => {
    const val = compactObject(obj[key])
    if (val) {
      res[key] = val
    }
  })

  return res
};

1161. 最大层内元素和

思路

广度优先搜索,算出每一层的和进行比较。

代码

js 复制代码
var maxLevelSum = function(root) {
  let level = 1
  let max = root.val
  let queue = []

  queue.push(root) 

  for (let l = 1; queue.length > 0; ++l) {
    const nq = []
    let sum = 0

    for (const n of queue) {
      sum += n.val
      n.left && nq.push(n.left)
      n.right && nq.push(n.right)
    }

    if (sum > max) {
      max = sum
      level = l
    }

    queue = nq
  }

  return level
};

700. 二叉搜索树中的搜索

思路

递归,根据二叉搜索树左节点值小于根节点,右节点的值大于根节点特性进行搜索。

代码

js 复制代码
var searchBST = function(root, val) {
   if (root === null) {
     return root
   }

   if (root.val === val) {
     return root
   }

   return searchBST(root.val > val ? root.left : root.right, val)
};

450. 删除二叉搜索树中的节点

思路

递归,如果当前节点值大于 key 值,就去左子树删除,否则去右子树;

如果当前节点值等于 key

情况一:没有左子节点,使用右子节点顶替该节点;

情况二:没有右子节点,使用左子节点顶替该节点;

情况三:左右都有,左子树移动到右子树最左边的节点,用右子树顶替该节点;

代码

js 复制代码
/**
 * @param {TreeNode} root
 * @param {number} key
 * @return {TreeNode}
 */
var deleteNode = function(root, key) {
   if (root === null) {
     return root
   }

   if (root.val > key) {
    // 去左子树搜索
    root.left = deleteNode(root.left, key)
   } else if (root.val < key) {
    // 去右子树搜索
    root.right = deleteNode(root.right, key)
   } else {
     if (!root.left) {
       return root.right
     }
     if (!root.right) {
       return root.left
     }
     // 找到右节点
     let node = root.right
     // 找到左子树最左边的节点
     while(node.left) {
       node = node.left
     }
     // 放到右子树上
     node.left = root.left
     // 右子树顶替该节点
     root = root.right
   }

   return root
};

本文完,感谢阅读 ❀

相关推荐
搞笑症患者4 小时前
压缩感知(Compressed Sensing, CS)
算法·最小二乘法·压缩感知·正交匹配追踪omp·迭代阈值it算法
im_AMBER4 小时前
Leetcode 101 对链表进行插入排序
数据结构·笔记·学习·算法·leetcode·排序算法
Hilaku4 小时前
我用 Gemini 3 Pro 手搓了一个并发邮件群发神器(附源码)
前端·javascript·github
IT_陈寒4 小时前
Java性能调优实战:5个被低估却提升30%效率的JVM参数
前端·人工智能·后端
快手技术5 小时前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
UrbanJazzerati5 小时前
统计学的"测谎仪":一文搞懂方差、标准差与“N-1”的秘密
面试
颜酱5 小时前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
做科研的周师兄5 小时前
【MATLAB 实战】栅格数据 K-Means 聚类(分块处理版)—— 解决大数据内存溢出、运行卡顿问题
人工智能·算法·机器学习·matlab·kmeans·聚类
X在敲AI代码5 小时前
leetcodeD3
数据结构·算法
全栈前端老曹5 小时前
【包管理】npm init 项目名后底层发生了什么的完整逻辑
前端·javascript·npm·node.js·json·包管理·底层原理