题目来源: 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
};
本文完,感谢阅读 ❀