-
Notifications
You must be signed in to change notification settings - Fork 236
/
Copy pathkthLargestValueBST.js
57 lines (48 loc) · 1.49 KB
/
kthLargestValueBST.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class BST {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
// Solution 1:
// O(n) time O(n) space
function findKthLargestValueInBst(tree, k) {
const sortedNodeValues = [];
inorderTraverse(tree, sortedNodeValues);
return sortedNodeValues[sortedNodeValues.length - k];
}
function inorderTraverse(node, sortedNodeValues) {
if (node === null) return;
inorderTraverse(node.left, sortedNodeValues);
sortedNodeValues.push(node.value);
inorderTraverse(node.right, sortedNodeValues);
}
// Solution 2:
// O(h + k) time | O(h) space - where h is the height of the tree and k is the input parameter
class TreeInfo {
constructor(numberOfNodesVisited, latestVisitedValue) {
this.numberOfNodesVisited = numberOfNodesVisited;
this.latestVisitedValue = latestVisitedValue;
}
}
function findKthLargestValueInBst2(tree, k) {
// Write your code here.
const treeInfo = new TreeInfo(0, -1);
reverseInorderTraverse(tree, treeInfo, k);
return treeInfo.latestVisitedValue;
}
function reverseInorderTraverse(node, treeInfo, k) {
if (node === null || treeInfo.numberOfNodesVisited >= k) {
return;
}
reverseInorderTraverse(node.right, treeInfo, k);
if (treeInfo.numberOfNodesVisited < k) {
treeInfo.numberOfNodesVisited += 1;
treeInfo.latestVisitedValue = node.value;
reverseInorderTraverse(node.left, treeInfo, k);
}
}
// Do not edit the lines below.
exports.BST = BST;
exports.findKthLargestValueInBst = findKthLargestValueInBst;