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

本文完,感谢阅读 ❀

相关推荐
leolee1818 分钟前
Redux Toolkit 实战使用指南
前端·react.js·redux
bluceli21 分钟前
React Hooks最佳实践:写出优雅高效的组件代码
前端·react.js
IT_陈寒30 分钟前
JavaScript代码效率提升50%?这5个优化技巧你必须知道!
前端·人工智能·后端
IT_陈寒31 分钟前
Java开发必知的5个性能优化黑科技,提升50%效率不是梦!
前端·人工智能·后端
LDX前端校草1 小时前
前端开发规则配置
前端
代码老中医1 小时前
2026前端工程化新范式:如何用AI驱动你的设计系统?
前端
用户11481867894841 小时前
Vite项目中的SVG雪碧图
前端·面试
这个实现不了1 小时前
vue写一些进度条样式1
前端
小蜜蜂dry1 小时前
可视化大屏适配方案之- px-To-viewport
前端
董员外2 小时前
LangChain.js 快速上手指南:Tool的使用,给大模型安上了双手
前端·javascript·后端