diff --git a/2023206/main.cpp b/2023206/main.cpp index 586cc7f..0059990 100644 --- a/2023206/main.cpp +++ b/2023206/main.cpp @@ -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() {