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

本文完,感谢阅读 ❀

相关推荐
伊丽莎白鹅7 分钟前
数字IC设计\FPGA 职位经典笔试面试整理--语法篇 Verilog && System Verilog(部分)
fpga开发·面试
andyleung52010 分钟前
murmur 算法
算法
浮华似水10 分钟前
Yargs里的Levenshtein距离算法
前端
2301_7819130522 分钟前
图论系列(dfs深搜)9.21
算法·深度优先·图论
边疆.23 分钟前
数据结构:内部排序
c语言·开发语言·数据结构·算法·排序算法
arin87625 分钟前
【图论】最短路应用
数据结构·算法
菜鸟求带飞_25 分钟前
算法打卡:第十一章 图论part03
java·数据结构·算法·深度优先·图论
终末圆37 分钟前
MyBatis XML映射文件编写【后端 18】
xml·java·开发语言·后端·算法·spring·mybatis
Damon小智39 分钟前
C#进阶-基于雪花算法的订单号设计与实现
开发语言·算法·c#·雪花算法·订单号
_.Switch43 分钟前
Python Web 架构设计与性能优化
开发语言·前端·数据库·后端·python·架构·log4j