问:
- 剑指 Offer 31. 栈的压入、弹出序列
- 剑指 Offer 32 - I. 从上到下打印二叉树
- 剑指 Offer 32 - II. 从上到下打印二叉树 II
- 剑指 Offer 32 - III. 从上到下打印二叉树 III
- 剑指 Offer 33. 二叉搜索树的后序遍历序列
- 剑指 Offer 34. 二叉树中和为某一值的路径
- 剑指 Offer 39. 数组中出现次数超过一半的数字 解:
const validateStackSequences = function(pushed, popped) {
let idx = 0
let idx2 = 0
const helpStack = []
while (idx <= pushed.length && idx2 < popped.length) {
const last = helpStack[helpStack.length - 1]
if (last !== popped[idx2]) {
if (idx === pushed.length) {
return false
}
helpStack.push(pushed[idx])
idx++
}else {
helpStack.pop()
idx2++
}
}
return !helpStack.length
};
const levelOrder = function(root) {
if (!root) return []
const queue = [root]
const res = []
while (queue.length) {
const cur = queue.shift()
res.push(cur.val)
if (cur.left) queue.push(cur.left)
if (cur.right) queue.push(cur.right)
}
return res
};
const levelOrder = function(root) {
if (!root) return []
const queue = [root]
const res = []
while (queue.length) {
const tempArr = []
const curQueue = queue.length
for (let i = 0; i < curQueue; i++) {
const curNode = queue.shift()
tempArr.push(curNode.val)
if (curNode.left) queue.push(curNode.left)
if (curNode.right) queue.push(curNode.right)
}
res.push(tempArr)
}
return res
};
const levelOrder = function(root) {
if (!root) return []
const queue = [root]
const res = []
let tag = true
while (queue.length) {
const curQueue = queue.length
res.push([])
for (let i = 0; i < curQueue; i++) {
const curNode = queue.shift()
tag ? res[res.length - 1].push(curNode.val) : res[res.length - 1].unshift(curNode.val)
if (curNode.left) queue.push(curNode.left)
if (curNode.right) queue.push(curNode.right)
}
tag = !tag
}
return res
};
const verifyPostorder = function(arr) {
function getRes(left, right) {
if (left >= right) return true
const target = arr[right]
let idx = left
// 找到第一个比[中]大的数
while (idx < right) {
if (arr[idx] > target) break
idx++
}
while (idx < right) {
if (arr[idx] < target) break
idx++
}
return idx === right && getRes(left, idx - 1) && getRes(idx, right - 1)
}
return getRes(0, arr.length - 1)
};
const pathSum = function(root, target) {
if (!root) return []
const preSumMap = new Map()
const preNodesMap = new Map()
const res = []
function getRes(node) {
const preSum = preSumMap.get(node) ?? 0
const preNodes = preNodesMap.get(node) ?? []
if (!node.left && !node.right) {
if (preSum + node.val === target) {
preNodes.push(node.val)
res.push(preNodes)
}
return
}
preNodes.push(node.val)
if (node.left) {
preSumMap.set(node.left, node.val + preSum)
preNodesMap.set(node.left, [...preNodes])
getRes(node.left)
}
if (node.right) {
preSumMap.set(node.right, node.val + preSum)
preNodesMap.set(node.right, [...preNodes])
getRes(node.right)
}
}
getRes(root)
return res
};
const majorityElement = function(arr) {
let candidate = null
let count = 0
for (let i of arr) {
if (count === 0) candidate = i
count += candidate === i ? 1 : -1
}
return candidate
};