Try to calcutate size realtime
This commit is contained in:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user