From eb931a74c9aaaaa64d4011c9f0cccbb06e423e93 Mon Sep 17 00:00:00 2001 From: Stoycho Kyosev Date: Mon, 12 Dec 2022 23:50:06 +0200 Subject: Add solution to exam task --- Seminar09/exam1.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Seminar09/exam1.cpp diff --git a/Seminar09/exam1.cpp b/Seminar09/exam1.cpp new file mode 100644 index 0000000..e8d4526 --- /dev/null +++ b/Seminar09/exam1.cpp @@ -0,0 +1,54 @@ +#include"../Seminar08/tree-utils.h" + +// pair.first -> Сумата до момента +// pair.second - Броя на наследниците, които изпълняват условието ключовете им да влизат в интервала в поддървото +std::pair findSumHelper(const Tree* t, int x, int y) { + if(t == nullptr) + return std::make_pair(0, 0); + + std::pair l = std::make_pair(0, 0); + std::pair r = std::make_pair(0, 0); + + if(t->data >= x) + l = findSumHelper(t->left, x, y); + + if(t->data <= y) + r = findSumHelper(t->right, x, y); + + bool oddChildren = ((l.second + r.second) % 2); + + int sum = l.first + r.first; + int count = l.second + r.second + (t->data >= x && t->data <= y); + + if(oddChildren) + sum += t->data; + + return std::make_pair(sum, count); +} + +int findSum(const Tree* t, int x, int y) { + return findSumHelper(t, x, y).first; +} + +int main() { + Tree* root = new Tree(50); + Tree* n1 = new Tree(25); + Tree* n2 = new Tree(75); + Tree* n3 = new Tree(12); + Tree* n4 = new Tree(30); + Tree* n5 = new Tree(60); + Tree* n6 = new Tree(85); + Tree* n7 = new Tree(52); + Tree* n8 = new Tree(70); + + root->left = n1; + root->right = n2; + n1->left = n3; + n1->right = n4; + n2->left = n5; + n2->right = n6; + n5->left = n7; + n5->right = n8; + + std::cout << findSum(root, 30, 75); +} \ No newline at end of file -- cgit v1.3.1-23-gd82d