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
};

本文完,感谢阅读 ❀

相关推荐
LanceJiang1 分钟前
设计模式在前端的简易实现与作用
前端·设计模式
Boop_wu7 分钟前
[Java 算法] 栈
java·开发语言·算法
代码煮茶7 分钟前
Vue3 虚拟列表实战 | 解决长列表性能问题(十万条数据流畅渲染,附原理)
前端·javascript·vue.js
追风落叶乔木生7 分钟前
字节跳动后端一面全解析|基础+算法真题(2026最新版)
算法·哈希算法
不爱吃炸鸡柳8 分钟前
C++ STL 核心:string 从入门到精通(面试+源码+OJ实战)
java·c++·面试
来自远方的老作者8 分钟前
第7章 运算符-7.5 比较运算符
开发语言·数据结构·python·算法·代码规范·比较运算符
雨季mo浅忆9 分钟前
前端如何实现长连接之使用WebSocket长连接
前端·websocket
We་ct13 分钟前
LeetCode 201. 数字范围按位与:位运算高效解题指南
开发语言·前端·javascript·算法·leetcode·typescript
wanderist.14 分钟前
图论模板整理
算法·深度优先·图论
Patrick_Wilson21 分钟前
你的 MR 超过 500 行了吗?——大型代码合并请求拆分实战指南
前端·代码规范·前端工程化