Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include "SplayTree.h"
- #include <gtest\gtest.h>
- TEST(Rotations, basic_left) {
- SplayTree<int> tree;
- SplayTree<int>::Node * x = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * y = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * up = new SplayTree<int>::Node(512);
- SplayTree<int>::Node * A = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * B = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * C = new SplayTree<int>::Node(258);
- x->left = A;
- x->right = B;
- x->up = y;
- y->left = x;
- y->right = C;
- y->up = up;
- A->up = x;
- B->up = x;
- C->up = y;
- up->right = y;
- tree.left(x);
- EXPECT_EQ(x->up, up);
- EXPECT_EQ(x->left, A);
- EXPECT_EQ(x->right, y);
- EXPECT_EQ(y->up, x);
- EXPECT_EQ(y->left, B);
- EXPECT_EQ(y->right, C);
- EXPECT_EQ(C->up, y);
- EXPECT_EQ(B->up, y);
- EXPECT_EQ(A->up, x);
- EXPECT_EQ(up->right, x);
- }
- TEST(Rotations, basic_right) {
- SplayTree<int> tree;
- SplayTree<int>::Node * x = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * y = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * up = new SplayTree<int>::Node(1337);
- SplayTree<int>::Node * A = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * B = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * C = new SplayTree<int>::Node(258);
- x->left = B; // B
- x->right = A; // A
- x->up = y;
- y->right = x;
- y->left = C; // C
- y->up = up; // U
- A->up = x;
- B->up = x;
- C->up = y;
- up->right = y;
- tree.right(x);
- EXPECT_EQ(x->up, up);
- EXPECT_EQ(x->right, A);
- EXPECT_EQ(x->left, y);
- EXPECT_EQ(y->up, x);
- EXPECT_EQ(y->right, B);
- EXPECT_EQ(y->left, C);
- EXPECT_EQ(C->up, y);
- EXPECT_EQ(B->up, y);
- EXPECT_EQ(A->up, x);
- EXPECT_EQ(up->right, x);
- }
- TEST(Rotations, leftleft_equals_two_lefts) {
- SplayTree<int>::Node * A = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * B = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * C = new SplayTree<int>::Node(258);
- SplayTree<int>::Node * D = new SplayTree<int>::Node(259);
- SplayTree<int> tree;
- SplayTree<int>::Node * x = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * y = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * z = new SplayTree<int>::Node(68);
- SplayTree<int>::Node * up = new SplayTree<int>::Node(1337);
- A->up = x;
- B->up = x;
- C->up = y;
- D->up = z;
- x->left = A; // A
- x->right = B; // B
- x->up = y;
- y->left = x;
- y->right = C; // C
- y->up = z;
- z->left = y;
- z->right = D; // D
- z->up = up;
- up->right = z;
- tree.left(x->up);
- tree.left(x);
- SplayTree<int>::Node * All = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * Bll = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * Cll = new SplayTree<int>::Node(258);
- SplayTree<int>::Node * Dll = new SplayTree<int>::Node(259);
- SplayTree<int>::Node * xll = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * yll = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * zll = new SplayTree<int>::Node(68);
- SplayTree<int>::Node * ull = new SplayTree<int>::Node(1337);
- xll->left = All; // A
- xll->right = Bll; // B
- xll->up = yll;
- yll->left = xll;
- yll->right = Cll; // C
- yll->up = zll;
- zll->left = yll;
- zll->right = Dll; // D
- zll->up = ull; // U
- ull->right = zll;
- tree.leftLeft(xll);
- EXPECT_EQ(xll->left->val,256);
- EXPECT_EQ(yll->left->val,257);
- EXPECT_EQ(zll->left->val,258);
- EXPECT_EQ(zll->right->val,259);
- EXPECT_EQ(x->left->val, xll->left->val);
- EXPECT_EQ(x->right->val, xll->right->val);
- EXPECT_EQ(x->up->val, xll->up->val);
- EXPECT_EQ(y->left->val, yll->left->val);
- EXPECT_EQ(y->right->val, yll->right->val);
- EXPECT_EQ(y->up->val, yll->up->val);
- EXPECT_EQ(z->left->val, zll->left->val); // C
- EXPECT_EQ(z->right->val, zll->right->val); // D
- EXPECT_EQ(z->up->val, zll->up->val);
- }
- TEST(Rotations, leftLeft_hard_check) {
- SplayTree<int>::Node * A = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * B = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * C = new SplayTree<int>::Node(258);
- SplayTree<int>::Node * D = new SplayTree<int>::Node(259);
- SplayTree<int> tree;
- SplayTree<int>::Node * x = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * y = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * z = new SplayTree<int>::Node(68);
- SplayTree<int>::Node * up = new SplayTree<int>::Node(1337);
- x->left = A; // A
- x->right = B; // B
- x->up = y;
- y->left = x;
- y->right = C; // C
- y->up = z;
- z->left = y;
- z->right = D; // D
- z->up = up; // U
- up->right = z;
- A->up = x;
- B->up = x;
- C->up = y;
- D->up = z;
- tree.leftLeft(x);
- EXPECT_EQ(x->left->val, A->val);
- EXPECT_EQ(x->right->val, y->val);
- EXPECT_EQ(x->up, up);
- EXPECT_EQ(up->right, x);
- EXPECT_EQ(y->up, x);
- EXPECT_EQ(y->left, B);
- EXPECT_EQ(y->right, z);
- EXPECT_EQ(z->up, y);
- EXPECT_EQ(z->left, C);
- EXPECT_EQ(z->right, D);
- EXPECT_EQ(A->up, x);
- EXPECT_EQ(B->up, y);
- EXPECT_EQ(C->up, z);
- EXPECT_EQ(D->up, z);
- }
- TEST(Rotations, rightLeft_hard_check) {
- SplayTree<int>::Node * A = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * B = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * C = new SplayTree<int>::Node(258);
- SplayTree<int>::Node * D = new SplayTree<int>::Node(259);
- SplayTree<int> tree;
- SplayTree<int>::Node * x = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * y = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * w = new SplayTree<int>::Node(68);
- SplayTree<int>::Node * up = new SplayTree<int>::Node(1337);
- y->left = w;
- y->right = D;
- y->up = up;
- w->left = A;
- w->right = x;
- w->up = y;
- x->left = B;
- x->right = C;
- x->up = w;
- B->up = x;
- C->up = x;
- A->up = w;
- D->up = y;
- up->left = y;
- tree.rightLeft(x);
- EXPECT_EQ(x->left->val, 68);
- EXPECT_EQ(x->right->val, 67);
- EXPECT_EQ(x->up, up);
- EXPECT_EQ(up->left, x);
- EXPECT_EQ(w->up, x);
- EXPECT_EQ(w->left, A);
- EXPECT_EQ(w->right, B);
- EXPECT_EQ(y->up, x);
- EXPECT_EQ(y->left, C);
- EXPECT_EQ(y->right, D);
- EXPECT_EQ(A->up, w);
- EXPECT_EQ(B->up, w);
- EXPECT_EQ(C->up, y);
- EXPECT_EQ(D->up, y);
- }
- TEST(Rotations, rightLeft_equals_right_left) {
- SplayTree<int>::Node * A = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * B = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * C = new SplayTree<int>::Node(258);
- SplayTree<int>::Node * D = new SplayTree<int>::Node(259);
- SplayTree<int> tree;
- SplayTree<int>::Node * x = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * y = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * w = new SplayTree<int>::Node(68);
- SplayTree<int>::Node * up = new SplayTree<int>::Node(1337);
- y->left = w;
- y->right = D;
- y->up = up;
- w->left = A;
- w->right = x;
- w->up = y;
- x->left = B;
- x->right = C;
- x->up = w;
- B->up = x;
- C->up = x;
- A->up = w;
- D->up = y;
- up->left = y;
- tree.right(x);
- tree.left(x);
- EXPECT_EQ(x->left->val, 68);
- EXPECT_EQ(x->right->val, 67);
- EXPECT_EQ(x->up, up);
- EXPECT_EQ(up->left, x);
- EXPECT_EQ(w->up, x);
- EXPECT_EQ(w->left, A);
- EXPECT_EQ(w->right, B);
- EXPECT_EQ(y->up, x);
- EXPECT_EQ(y->left, C);
- EXPECT_EQ(y->right, D);
- EXPECT_EQ(A->up, w);
- EXPECT_EQ(B->up, w);
- EXPECT_EQ(C->up, y);
- EXPECT_EQ(D->up, y);
- }
- TEST(Rotations, rightRight_hard_check) {
- SplayTree<int>::Node * A = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * B = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * C = new SplayTree<int>::Node(258);
- SplayTree<int>::Node * D = new SplayTree<int>::Node(259);
- SplayTree<int> tree;
- SplayTree<int>::Node * x = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * y = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * z = new SplayTree<int>::Node(68);
- SplayTree<int>::Node * up = new SplayTree<int>::Node(1337);
- up->left = z;
- z->up = up;
- z->left = D;
- z->right = y;
- y->left = C;
- y->right = x;
- y->up = z;
- x->up = y;
- x->left = B;
- x->right = A;
- A->up = x;
- B->up = x;
- C->up = y;
- D->up = z;
- tree.rightRight(x);
- EXPECT_EQ(x->up, up);
- EXPECT_EQ(x->left, y);
- EXPECT_EQ(x->right, A);
- EXPECT_EQ(up->left, x);
- EXPECT_EQ(y->up, x);
- EXPECT_EQ(y->left, z);
- EXPECT_EQ(y->right, B);
- EXPECT_EQ(z->up, y);
- EXPECT_EQ(z->left, D);
- EXPECT_EQ(z->right, C);
- EXPECT_EQ(A->up, x);
- EXPECT_EQ(B->up, y);
- EXPECT_EQ(C->up, z);
- EXPECT_EQ(D->up, z);
- }
- TEST(Rotations, right_right_equals_rightRight) {
- SplayTree<int>::Node * A = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * B = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * C = new SplayTree<int>::Node(258);
- SplayTree<int>::Node * D = new SplayTree<int>::Node(259);
- SplayTree<int> tree;
- SplayTree<int>::Node * x = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * y = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * z = new SplayTree<int>::Node(68);
- SplayTree<int>::Node * up = new SplayTree<int>::Node(1337);
- up->left = z;
- z->up = up;
- z->left = D;
- z->right = y;
- y->left = C;
- y->right = x;
- y->up = z;
- x->up = y;
- x->left = B;
- x->right = A;
- A->up = x;
- B->up = x;
- C->up = y;
- D->up = z;
- tree.right(x->up);
- tree.right(x);
- EXPECT_EQ(x->up, up);
- EXPECT_EQ(x->left, y);
- EXPECT_EQ(x->right, A);
- EXPECT_EQ(up->left, x);
- EXPECT_EQ(y->up, x);
- EXPECT_EQ(y->left, z);
- EXPECT_EQ(y->right, B);
- EXPECT_EQ(z->up, y);
- EXPECT_EQ(z->left, D);
- EXPECT_EQ(z->right, C);
- EXPECT_EQ(A->up, x);
- EXPECT_EQ(B->up, y);
- EXPECT_EQ(C->up, z);
- EXPECT_EQ(D->up, z);
- }
- TEST(Rotations, leftRight_hard_check) {
- SplayTree<int>::Node * A = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * B = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * C = new SplayTree<int>::Node(258);
- SplayTree<int>::Node * D = new SplayTree<int>::Node(259);
- SplayTree<int> tree;
- SplayTree<int>::Node * x = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * y = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * w = new SplayTree<int>::Node(68);
- SplayTree<int>::Node * up = new SplayTree<int>::Node(1337);
- y->left = D;
- y->right = w;
- y->up = up;
- w->left = x;
- w->right = A;
- w->up = y;
- x->left = C;
- x->right = B;
- x->up = w;
- B->up = x;
- C->up = x;
- A->up = w;
- D->up = y;
- up->left = y;
- tree.leftRight(x);
- EXPECT_EQ(x->left, y);
- EXPECT_EQ(x->right, w);
- EXPECT_EQ(x->up, up);
- EXPECT_EQ(up->left, x);
- EXPECT_EQ(w->up, x);
- EXPECT_EQ(w->left, B);
- EXPECT_EQ(w->right, A);
- EXPECT_EQ(y->up, x);
- EXPECT_EQ(y->left, D);
- EXPECT_EQ(y->right, C);
- EXPECT_EQ(A->up, w);
- EXPECT_EQ(B->up, w);
- EXPECT_EQ(C->up, y);
- EXPECT_EQ(D->up, y);
- }
- TEST(Rotations, left_right_equals_leftRight) {
- SplayTree<int>::Node * A = new SplayTree<int>::Node(256);
- SplayTree<int>::Node * B = new SplayTree<int>::Node(257);
- SplayTree<int>::Node * C = new SplayTree<int>::Node(258);
- SplayTree<int>::Node * D = new SplayTree<int>::Node(259);
- SplayTree<int> tree;
- SplayTree<int>::Node * x = new SplayTree<int>::Node(66);
- SplayTree<int>::Node * y = new SplayTree<int>::Node(67);
- SplayTree<int>::Node * w = new SplayTree<int>::Node(68);
- SplayTree<int>::Node * up = new SplayTree<int>::Node(1337);
- y->left = D;
- y->right = w;
- y->up = up;
- w->left = x;
- w->right = A;
- w->up = y;
- x->left = C;
- x->right = B;
- x->up = w;
- B->up = x;
- C->up = x;
- A->up = w;
- D->up = y;
- up->left = y;
- tree.left(x);
- tree.right(x);
- EXPECT_EQ(x->left, y);
- EXPECT_EQ(x->right, w);
- EXPECT_EQ(x->up, up);
- EXPECT_EQ(up->left, x);
- EXPECT_EQ(w->up, x);
- EXPECT_EQ(w->left, B);
- EXPECT_EQ(w->right, A);
- EXPECT_EQ(y->up, x);
- EXPECT_EQ(y->left, D);
- EXPECT_EQ(y->right, C);
- EXPECT_EQ(A->up, w);
- EXPECT_EQ(B->up, w);
- EXPECT_EQ(C->up, y);
- EXPECT_EQ(D->up, y);
- }
- TEST(Insert, insert_counts_size) {
- SplayTree<int> tree;
- tree.insert(1);
- tree.insert(2);
- tree.insert(1337);
- EXPECT_EQ(tree.size(), 3);
- }
- TEST(Insert, insert_on_empty_changes_root) {
- SplayTree<int> tree;
- EXPECT_EQ(tree.mRoot, nullptr);
- tree.insert(1);
- tree.insert(2);
- tree.insert(3);
- EXPECT_NE(tree.mRoot, nullptr);
- }
- TEST(Insert, tree_is_in_correct_order_after_insert1) {
- SplayTree<int> tree;
- tree.insert(1);
- tree.insert(2);
- tree.insert(3);
- EXPECT_EQ(tree.mRoot->val, 3);
- EXPECT_EQ(tree.mRoot->right, nullptr);
- EXPECT_EQ(tree.mRoot->left->val, 2);
- EXPECT_EQ(tree.mRoot->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->left->left->val, 1);
- EXPECT_EQ(tree.mRoot->left->left->right, nullptr);
- }
- TEST(Insert, tree_is_in_correct_order_after_insert2) {
- SplayTree<int> tree;
- tree.insert(3);
- tree.insert(1);
- tree.insert(2);
- EXPECT_EQ(tree.mRoot->val, 2);
- EXPECT_EQ(tree.mRoot->left->val, 1);
- EXPECT_EQ(tree.mRoot->right->val, 3);
- EXPECT_EQ(tree.mRoot->left->left, nullptr);
- EXPECT_EQ(tree.mRoot->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->right->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->right, nullptr);
- }
- TEST(Insert, tree_is_in_correct_order_after_insert3) {
- SplayTree<int> tree;
- tree.insert(5);
- tree.insert(7);
- tree.insert(1);
- tree.insert(6);
- tree.insert(4);
- tree.insert(3);
- EXPECT_EQ(tree.mRoot->val, 3);
- EXPECT_EQ(tree.mRoot->up, nullptr);
- EXPECT_EQ(tree.mRoot->left->val, 1);
- EXPECT_EQ(tree.mRoot->left->left, nullptr);
- EXPECT_EQ(tree.mRoot->left->up, tree.mRoot);
- EXPECT_EQ(tree.mRoot->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->right->val, 4);
- EXPECT_EQ(tree.mRoot->right->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->up, tree.mRoot);
- EXPECT_EQ(tree.mRoot->right->right->val, 6);
- EXPECT_EQ(tree.mRoot->right->right->left->val, 5);
- EXPECT_EQ(tree.mRoot->right->right->left->up, tree.mRoot->right->right);
- EXPECT_EQ(tree.mRoot->right->right->left->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->right->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->right->right->right->val, 7);
- EXPECT_EQ(tree.mRoot->right->right->right->up, tree.mRoot->right->right);
- EXPECT_EQ(tree.mRoot->right->right->right->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->right->right->right, nullptr);
- }
- TEST(Insert, duplicate_value) {
- SplayTree<int> tree;
- SplayTree<int>::Node* firstZero = tree.insert(0);
- SplayTree<int>::Node* firstOne = tree.insert(1);
- EXPECT_EQ(tree.insert(0), firstZero);
- EXPECT_EQ(tree.insert(1), firstOne);
- EXPECT_EQ(tree.insert(1), firstOne);
- }
- TEST(Find, find_finds_correct_value) {
- SplayTree<int> tree;
- tree.insert(1);
- tree.insert(2);
- int dummy;
- EXPECT_EQ(tree.find(1, dummy)->val, 1);
- EXPECT_EQ(dummy, 1);
- EXPECT_EQ(tree.find(2, dummy)->val, 2);
- EXPECT_EQ(dummy, 1);
- EXPECT_EQ(tree.find(2, dummy)->val, 2);
- EXPECT_EQ(dummy, 0);
- }
- TEST(Find, find_splays_tree1) {
- SplayTree<int> tree;
- int dummy;
- tree.insert(1);
- tree.insert(2);
- tree.insert(3);
- EXPECT_EQ(tree.mRoot->val, 3);
- EXPECT_EQ(tree.mRoot->right, nullptr);
- EXPECT_EQ(tree.mRoot->left->val, 2);
- EXPECT_EQ(tree.mRoot->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->left->left->val, 1);
- EXPECT_EQ(tree.mRoot->left->left->right, nullptr);
- tree.find(2, dummy);
- EXPECT_EQ(dummy, 1);
- EXPECT_EQ(tree.mRoot->val, 2);
- EXPECT_EQ(tree.mRoot->left->val, 1);
- EXPECT_EQ(tree.mRoot->right->val, 3);
- EXPECT_EQ(tree.mRoot->left->left, nullptr);
- EXPECT_EQ(tree.mRoot->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->right->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->right, nullptr);
- tree.find(3, dummy);
- EXPECT_EQ(dummy, 1);
- EXPECT_EQ(tree.mRoot->val, 3);
- EXPECT_EQ(tree.mRoot->right, nullptr);
- EXPECT_EQ(tree.mRoot->left->val, 2);
- EXPECT_EQ(tree.mRoot->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->left->left->val, 1);
- EXPECT_EQ(tree.mRoot->left->left->right, nullptr);
- }
- TEST(Find, find_splays_tree2) {
- SplayTree<int> tree;
- int dummy;
- tree.insert(3);
- tree.insert(1);
- tree.insert(2);
- EXPECT_EQ(tree.mRoot->val, 2);
- EXPECT_EQ(tree.mRoot->left->val, 1);
- EXPECT_EQ(tree.mRoot->right->val, 3);
- EXPECT_EQ(tree.mRoot->left->left, nullptr);
- EXPECT_EQ(tree.mRoot->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->right->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->right, nullptr);
- tree.find(1, dummy);
- EXPECT_EQ(dummy, 1);
- EXPECT_EQ(tree.mRoot->val, 1);
- EXPECT_EQ(tree.mRoot->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->val, 2);
- EXPECT_EQ(tree.mRoot->right->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->right->val, 3);
- EXPECT_EQ(tree.mRoot->right->right->left, nullptr);
- tree.find(3, dummy);
- EXPECT_EQ(dummy, 2);
- EXPECT_EQ(tree.mRoot->val, 3);
- EXPECT_EQ(tree.mRoot->right, nullptr);
- EXPECT_EQ(tree.mRoot->left->val, 2);
- EXPECT_EQ(tree.mRoot->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->left->left->val, 1);
- EXPECT_EQ(tree.mRoot->left->left->right, nullptr);
- }
- TEST(Find, find_splays_tree_big) {
- SplayTree<int> tree;
- tree.insert(5);
- tree.insert(7);
- tree.insert(1);
- tree.insert(6);
- tree.insert(4);
- tree.insert(3);
- EXPECT_EQ(tree.mRoot->val, 3);
- EXPECT_EQ(tree.mRoot->up, nullptr);
- EXPECT_EQ(tree.mRoot->left->val, 1);
- EXPECT_EQ(tree.mRoot->left->left, nullptr);
- EXPECT_EQ(tree.mRoot->left->up, tree.mRoot);
- EXPECT_EQ(tree.mRoot->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->right->val, 4);
- EXPECT_EQ(tree.mRoot->right->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->up, tree.mRoot);
- EXPECT_EQ(tree.mRoot->right->right->val, 6);
- EXPECT_EQ(tree.mRoot->right->right->left->val, 5);
- EXPECT_EQ(tree.mRoot->right->right->left->up, tree.mRoot->right->right);
- EXPECT_EQ(tree.mRoot->right->right->left->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->right->left->right, nullptr);
- EXPECT_EQ(tree.mRoot->right->right->right->val, 7);
- EXPECT_EQ(tree.mRoot->right->right->right->up, tree.mRoot->right->right);
- EXPECT_EQ(tree.mRoot->right->right->right->left, nullptr);
- EXPECT_EQ(tree.mRoot->right->right->right->right, nullptr);
- int dummy;
- tree.find(5, dummy);
- EXPECT_EQ(dummy, 3);
- EXPECT_EQ(tree.mRoot->val, 5);
- EXPECT_EQ(tree.mRoot->up, nullptr);
- SplayTree<int>::Node* left = tree.mRoot->left;
- SplayTree<int>::Node* right = tree.mRoot->right;
- EXPECT_EQ(left->val, 3);
- EXPECT_EQ(left->left->val, 1);
- EXPECT_EQ(left->right->val, 4);
- EXPECT_EQ(left->up, tree.mRoot);
- EXPECT_EQ(left->left->up, left);
- EXPECT_EQ(left->right->up, left);
- EXPECT_EQ(right->up, tree.mRoot);
- EXPECT_EQ(right->val, 6);
- EXPECT_EQ(right->left, nullptr);
- EXPECT_EQ(right->right->up, right);
- EXPECT_EQ(right->right->val, 7);
- }
- TEST(Splay, splay_on_one) {
- SplayTree<int> tree;
- tree.insert(0);
- tree.splay(tree.mRoot);
- EXPECT_EQ(tree.mRoot->val, 0);
- EXPECT_EQ(tree.mRoot->left, nullptr);
- EXPECT_EQ(tree.mRoot->right, nullptr);
- EXPECT_EQ(tree.mRoot->up, nullptr);
- }
- TEST(FindMax, repeated_max) {
- SplayTree<int> tree;
- tree.insert(0);
- SplayTree<int>::Node* max = tree.insert(10);
- tree.insert(1);
- tree.insert(4);
- EXPECT_EQ(tree.maximum(), max);
- SplayTree<int>::Node* newMax = tree.insert(11);
- EXPECT_EQ(tree.maximum(), newMax);
- int dummy;
- tree.find(0, dummy);
- EXPECT_EQ(dummy, 4);
- tree.find(1, dummy);
- EXPECT_EQ(dummy, 2);
- tree.find(4, dummy);
- EXPECT_EQ(dummy, 2);
- EXPECT_EQ(tree.maximum(), newMax);
- }
- TEST(InsertFind, comprehensive_1) {
- SplayTree<int> tree;
- tree.insert(10);
- tree.insert(4);
- tree.insert(6);
- tree.insert(9);
- tree.insert(13);
- tree.insert(2);
- tree.insert(7);
- tree.insert(16);
- EXPECT_EQ(tree.mRoot->val, 16);
- EXPECT_EQ(tree.mRoot->right, nullptr);
- auto sedm = tree.mRoot->left;
- EXPECT_EQ(sedm->val, 7);
- auto dva = sedm->left;
- EXPECT_EQ(sedm->left->val, 2);
- auto trinc = sedm->right;
- EXPECT_EQ(sedm->right->val, 13);
- EXPECT_EQ(dva->right->val, 6);
- EXPECT_EQ(trinc->left->val, 9);
- EXPECT_EQ(dva->right->left->val, 4);
- EXPECT_EQ(trinc->left->right->val, 10);
- int dummy;
- tree.find(7, dummy);
- tree.find(9, dummy);
- tree.find(4, dummy);
- tree.find(10, dummy);
- tree.find(13, dummy);
- tree.find(2, dummy);
- tree.find(9, dummy);
- tree.find(2, dummy);
- tree.find(4, dummy);
- tree.find(16, dummy);
- tree.find(7, dummy);
- tree.find(4, dummy);
- tree.find(9, dummy);
- tree.find(13, dummy);
- trinc = tree.mRoot;
- EXPECT_EQ(trinc->val, 13);
- EXPECT_EQ(trinc->right->val, 16);
- auto devet = trinc->left;
- EXPECT_EQ(devet->val, 9);
- EXPECT_EQ(devet->right->val, 10);
- auto ctyri = devet->left;
- EXPECT_EQ(ctyri->val, 4);
- EXPECT_EQ(ctyri->left->val, 2);
- EXPECT_EQ(ctyri->right->val, 7);
- EXPECT_EQ(ctyri->right->left->val, 6);
- }
- TEST(Delete, deletes_all_simple)
- {
- SplayTree<int> tree;
- int dummy;
- tree.insert(3);
- tree.insert(4);
- tree.insert(5);
- tree.find(4, dummy);
- EXPECT_EQ(dummy, 1);
- EXPECT_EQ(3, tree.reset());
- }
- TEST(Delete, deletes_all)
- {
- SplayTree<int> tree;
- tree.insert(10);
- tree.insert(4);
- tree.insert(6);
- tree.insert(9);
- tree.insert(13);
- tree.insert(2);
- tree.insert(7);
- tree.insert(16);
- EXPECT_EQ(8, tree.reset());
- }
- TEST(Delete, deletes_big) {
- srand(1337);
- SplayTree<int> tree;
- int vertCount = 300000;
- for (int i = 0; i < vertCount; ++i) {
- tree.insert(vertCount - i);
- }
- EXPECT_EQ(tree.reset(), vertCount);
- }
- TEST(ERASE, erase1) {
- SplayTree<int> tree;
- tree.insert(3);
- tree.insert(4);
- tree.insert(5);
- tree.erase(3);
- int dummy;
- EXPECT_EQ(tree.size(), 2);
- EXPECT_TRUE(tree.mRoot->val == 4 || tree.mRoot->val == 5);
- if (tree.mRoot->val == 4) {
- EXPECT_TRUE(tree.mRoot->right->val == 5);
- EXPECT_EQ(tree.mRoot->right->up, tree.mRoot);
- }
- else {
- EXPECT_TRUE(tree.mRoot->left->val == 4);
- EXPECT_EQ(tree.mRoot->left->up, tree.mRoot);
- }
- EXPECT_TRUE(tree.find(5, dummy));
- EXPECT_EQ(tree.find(3, dummy), nullptr);
- EXPECT_NE(tree.find(4, dummy), nullptr);
- tree.insert(3);
- EXPECT_NE(tree.find(3, dummy), nullptr);
- tree.erase(3);
- EXPECT_EQ(tree.find(3, dummy), nullptr);
- EXPECT_FALSE(tree.erase(3));
- EXPECT_TRUE(tree.erase(4));
- EXPECT_TRUE(tree.erase(5));
- EXPECT_TRUE(tree.empty());
- }
- struct instr
- {
- char instruct;
- int elem;
- };
- class Executer {
- #define BATCH_SIZE 50000
- int currentN;
- int findCount;
- int avgFindLen;
- bool read1k(std::vector<std::string>& instructions)
- {
- instructions.clear();
- instructions.reserve(BATCH_SIZE);
- std::string line;
- for (int i = 0; i < BATCH_SIZE; ++i) {
- if (!std::getline(std::cin, line))
- return false;
- instructions.push_back(line);
- }
- return true;
- }
- void execute(const std::vector<std::string>& instructions, SplayTree<int>& tree)
- {
- for (const auto& instruction : instructions) {
- if (instruction[0] == 'I') {
- tree.insert(atoi(instruction.c_str() + 2));
- //std::cout << "I " << atoi(instruction.c_str() + 2) << "\n";
- }
- else if (instruction[0] == 'F') {
- int pathLen;
- tree.find(atoi(instruction.c_str() + 2), pathLen);
- avgFindLen += pathLen;
- findCount++;
- //std::cout << "F " << atoi(instruction.c_str() + 2) << ", len: " << pathLen << "\n";
- }
- else if (instruction[0] == '#') {
- if (!tree.empty()) {
- tree.reset();
- std::cout << "N;" << currentN <<
- ";AvgLen;" << float(float(avgFindLen) / findCount) <<
- ";CumulLen;" << avgFindLen <<
- ";findCount;" << findCount << "\n";
- }
- currentN = atoi(instruction.c_str() + 2);
- avgFindLen = 0;
- findCount = 0;
- }
- }
- }
- public:
- Executer() : currentN(0), findCount(0), avgFindLen(0) {};
- void readInput() {
- SplayTree<int> tree;
- std::vector<std::string> instructions;
- bool contRead = true;
- while (contRead) {
- contRead = read1k(instructions);
- execute(instructions, tree);
- }
- tree.reset();
- std::cout << "N;" << currentN <<
- ";AvgLen;" << float(float(avgFindLen) / findCount) <<
- ";CumulLen;" << avgFindLen <<
- ";findCount;" << findCount << "\n";
- }
- };
- int main(int argc, wchar_t** argv) {
- //// Google test
- //::testing::InitGoogleTest(&argc, argv);
- //RUN_ALL_TESTS();
- #ifdef LAZY_SPLAY
- std::cout << "LAZY SPLAY\n";
- #endif
- // Runtime
- Executer exec;
- exec.readInput();
- std::cout << "end";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement