Try to calcutate size realtime

This commit is contained in:
unlockable
2023-11-29 17:23:19 +08:00
parent 04912a54bd
commit 3b252c7cd0

View File

@@ -2,7 +2,6 @@
#define TREE_SIZE 50000
struct TreeNode {
int val;
int size;
int left;
int right;
};
@@ -30,16 +29,16 @@ int dequeue() {
int insert_node(int num, int pos) {
if (pos < 0) {
// The tree_root is -1!
tree[new_tree_node] = TreeNode{num, 1, -1, -1};
tree[new_tree_node] = TreeNode{num, -1, -1};
tree_root = new_tree_node;
new_tree_node = (new_tree_node + 1) % TREE_SIZE;
return 0;
}
tree[pos].size++;
// tree[pos].size++;
if (tree[pos].val > num) {
if (tree[pos].left < 0) {
tree[pos].left = new_tree_node;
tree[new_tree_node] = TreeNode{num, 1, -1, -1};
tree[new_tree_node] = TreeNode{num, -1, -1};
new_tree_node = (new_tree_node + 1) % TREE_SIZE;
return 0;
}
@@ -51,7 +50,7 @@ int insert_node(int num, int pos) {
else {
if (tree[pos].right < 0) {
tree[pos].right = new_tree_node;
tree[new_tree_node] = TreeNode{num, 1, -1, -1};
tree[new_tree_node] = TreeNode{num, -1, -1};
new_tree_node = (new_tree_node + 1) % TREE_SIZE;
return 0;
}
@@ -68,13 +67,13 @@ int delete_node(int num, int pos) {
}
if (tree[pos].val < num) {
tree[pos].size--;
// tree[pos].size--;
tree[pos].right = delete_node(num, tree[pos].right);
return pos;
}
if (tree[pos].val > num) {
tree[pos].size--;
// tree[pos].size--;
tree[pos].left = delete_node(num, tree[pos].left);
return pos;
}
@@ -94,11 +93,11 @@ int delete_node(int num, int pos) {
// Here, we deal with the case that both children exist.
int parent = pos;
int child = tree[parent].right;
tree[parent].size--;
// tree[parent].size--;
while (tree[child].left >= 0) {
parent = child;
child = tree[child].left;
tree[parent].size--;
// tree[parent].size--;
}
if (parent == pos) {
@@ -133,16 +132,24 @@ int traverse(int pos) {
return 0;
}
int get_size(int pos) {
if (pos < 0) {
return 0;
}
return 1 + get_size(tree[pos].left) + get_size(tree[pos].right);
}
int count_less_than(long long target, int pos) {
if (pos < 0) {
return 0;
}
if (tree[pos].val < target) {
if (tree[pos].left < 0) {
return 1 + count_less_than(target, tree[pos].right);
}
return tree[tree[pos].left].size + 1 + count_less_than(target, tree[pos].right);
// if (tree[pos].left < 0) {
// return 1 + count_less_than(target, tree[pos].right);
// }
// return tree[tree[pos].left].size + 1 + count_less_than(target, tree[pos].right);
return get_size(tree[pos].left) + 1 + count_less_than(target, tree[pos].right);
}
if (tree[pos].val > target) {
return count_less_than(target, tree[pos].left);
@@ -150,10 +157,10 @@ int count_less_than(long long target, int pos) {
// tree[pos].val == target
if (tree[pos].left < 0) {
return 1;
}
return 1 + tree[tree[pos].left].size;
// if (tree[pos].left < 0) {
// return 1;
// }
return 1 + get_size(tree[pos].left);
}
int main() {