# 703. Kth Largest Element in a Stream
題目:<https://leetcode.com/problems/kth-largest-element-in-a-stream/>
解法:使用 binary search tree,並保持只有 k 個節點,第 k 大的值即為 BST的最小值。
Python3:
``` python 3
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def treeToList(root):
if not root:
return []
from collections import deque
nodes = deque()
nodes.append(root)
arr = []
arr.append(root.val)
while len(nodes):
node = nodes.popleft()
if node.left:
nodes.append(node.left)
arr.append(node.left.val)
else:
arr.append(None)
if node.right:
nodes.append(node.right)
arr.append(node.right.val)
else:
arr.append(None)
return arr
class KthLargest:
def __init__(self, k: int, nums: list[int]):
self.k = k
self.size = 0
self.root = None
for num in nums:
self.add(num)
def add(self, val: int) -> int:
if self.size < self.k:
self.insertIntoBST(val)
self.size += 1
else:
if val > self.minVal():
self.insertIntoBST(val)
self.deleteMinNode()
return self.minVal()
def insertIntoBST(self, val: int):
if not self.root:
self.root = TreeNode(val)
return;
parent = None
cur = self.root
while cur:
parent = cur
if val < cur.val:
cur = cur.left
else:
cur = cur.right
if val < parent.val:
parent.left = TreeNode(val)
else:
parent.right = TreeNode(val)
def minVal(self) -> int:
cur = self.root
while cur.left:
cur = cur.left
return cur.val
def deleteMinNode(self):
delParent = None
delNode = self.root
while delNode.left:
delParent = delNode
delNode = delNode.left
if delParent is None:
self.root = delNode.right
else:
delParent.left = delNode.right
if __name__ == '__main__':
k = 1
nums = []
obj = KthLargest(k, nums)
print(obj.add(-3))
print(obj.add(-2))
print(obj.add(-4))
print(obj.add(0))
print(obj.add(4))
```
C:
``` c
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
void printLevelOrderWithNull(struct TreeNode* root) {
struct TreeNode * bfs[10000] = {};
bfs[0] = root;
int i = 0, len = 1;
printf("%d ", root->val);
while (i < len) {
if (bfs[i]->left != NULL) {
bfs[len++] = bfs[i]->left;
printf("%d ", bfs[i]->left->val);
} else
printf("null ");
if (bfs[i]->right != NULL) {
bfs[len++] = bfs[i]->right;
printf("%d ", bfs[i]->right->val);
} else
printf("null ");
i++;
}
printf("\n");
}
struct TreeNode* insertIntoBST(struct TreeNode* root, int val) {
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
if (root == NULL)
return node;
struct TreeNode *parent = NULL, *cur = root;
while(cur != NULL) {
parent = cur;
if (val < cur->val)
cur = cur->left;
else
cur = cur->right;
}
if (val < parent->val)
parent->left = node;
else
parent->right = node;
return root;
}
int minVal(struct TreeNode* root) {
struct TreeNode* cur = root;
while (cur->left != NULL)
cur = cur->left;
return cur->val;
}
struct TreeNode* deleteMinNode(struct TreeNode* root) {
struct TreeNode *delParent = NULL, *delNode = root;
while (delNode->left != NULL) {
delParent = delNode;
delNode = delNode->left;
}
if (delParent == NULL)
return delNode->right;
else
delParent->left = delNode->right;
return root;
}
typedef struct {
int k;
int size;
struct TreeNode* root;
} KthLargest;
int kthLargestAdd(KthLargest* obj, int val) {
if (obj->size < obj->k) {
obj->root = insertIntoBST(obj->root, val);
obj->size++;
} else {
if (val > minVal(obj->root)) {
obj->root = insertIntoBST(obj->root, val);
obj->root = deleteMinNode(obj->root);
}
}
return minVal(obj->root);
}
KthLargest* kthLargestCreate(int k, int* nums, int numsSize) {
KthLargest* obj = (KthLargest*)malloc(sizeof(KthLargest));
obj->k = k;
obj->size = 0;
obj->root = NULL;
for (int i = 0; i < numsSize; i++) {
kthLargestAdd(obj, nums[i]);
}
return obj;
}
void TreeNodeFree(struct TreeNode* root) {
if (root == NULL)
return;
TreeNodeFree(root->left);
TreeNodeFree(root->right);
free(root);
return;
}
void kthLargestFree(KthLargest* obj) {
TreeNodeFree(obj->root);
free(obj);
return;
}
int main()
{
int k = 1;
int nums[] = {};
int numsSize = 0;
KthLargest* obj = kthLargestCreate(k, nums, numsSize);
printf("%d\n", kthLargestAdd(obj, -3));
printf("%d\n", kthLargestAdd(obj, -2));
printf("%d\n", kthLargestAdd(obj, -4));
printf("%d\n", kthLargestAdd(obj, 0));
printf("%d\n", kthLargestAdd(obj, 4));
kthLargestFree(obj);
return 0;
}
```
###### tags: `leetcode` `binary tree` `binary search tree`