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

本文完,感谢阅读 ❀

相关推荐
cwplh23 分钟前
Manacher(马拉车算法)详解
算法
22jimmy29 分钟前
JavaWeb(二)CSS
java·开发语言·前端·css·入门·基础
m0_738120723 小时前
CTFshow系列——命令执行web38-40
前端·windows·安全·web安全
是小狐狸呀5 小时前
elementUI-表单-下拉框数据选中后,视图不更新
前端·javascript·elementui
快去睡觉~6 小时前
力扣73:矩阵置零
算法·leetcode·矩阵
小欣加油7 小时前
leetcode 3 无重复字符的最长子串
c++·算法·leetcode
四岁半儿8 小时前
常用css
前端·css
你的人类朋友8 小时前
说说git的变基
前端·git·后端
姑苏洛言8 小时前
网页作品惊艳亮相!这个浪浪山小妖怪网站太治愈了!
前端
字节逆旅8 小时前
nvm 安装pnpm的异常解决
前端·npm