Я пытаюсь решить следующую проблему с алгоритмами:
Учитывая двоичное дерево поиска (BST) с дубликатами, найти все режимы (наиболее часто встречающийся элемент) в учитывая BST. Предположим, что BST определяется следующим образом: Левое поддерево узла содержит только узлы с ключами, меньшими или равными ключу узла. Правое поддерево узла содержит только узлы с ключами, которые больше или равны ключу узла. И левое, и правое поддеревья также должны быть бинарными деревьями поиска.
Например: задано BST [1, null, 2,2],
1
\
2
/
2
return [2].
Примечание. Если дерево имеет несколько режимов, вы можете вернуть их в любом порядке. Последующие действия: не могли бы вы сделать это без использования дополнительного пространства? (Предположим, что неявное пространство стека, возникшее из-за рекурсии, не считается).
Я написал следующий код, но последний тестовый пример не проходит:
class TreeNode {
constructor(val, left, right) {
this.val = (val === undefined ? 0 : val)
this.left = (left === undefined ? null : left)
this.right = (right === undefined ? null : right)
}
}
//updated code, doesn't seem to work, not sure if I am editing it the way it is suggested.
const findMode = root => {
if (!root) return []
if (root && !root.left && !root.right) return [root.val]
const hash = {}
let current = root
let result = []
let keys
const dfs = c => {
if (!c) return
if (c.left) dfs(c.left)
hash[c.val] = (hash[c.val] || 0) + 1
if (c.right) dfs(c.right)
}
dfs(current)
// keys = Object.keys(hash)
// if (keys.length <= 1) return [+keys]
// else keys.reduce((a, b) => {
// if (hash[a] === hash[b]) result.push(+a, +b)
// else if (hash[a] > hash[b]) {
// result.push(+a)
// } else result.push(+b)
// })
// return result
keys = Object.keys(hash);
keys.sort((a, b) => hash[b] - hash[a]);
keys.forEach(key => {
if (hash[key] === keys[0]) result.push(key);
})
return result
}
Вот тестовые случаи:
const tree = new TreeNode(1, null, new TreeNode(2, new TreeNode(2)))
console.log(findMode(tree)) //[2]
const tree2 = new TreeNode(1, null, new TreeNode(2))
console.log(findMode(tree2)) //[1,2]
const tree3 = new TreeNode(2147483647)
console.log(findMode(tree3)) //[2147483647]
const tree4 = new TreeNode(1, new TreeNode(1))
console.log(findMode(tree4)) // should be [1], but is []
Что я делаю не так?