From 2189be6de895f9ff392527c508493911937a6ea3 Mon Sep 17 00:00:00 2001 From: Usova Marina A Date: Sat, 25 Feb 2017 17:11:37 +0300 Subject: [PATCH] Implementation of search function in tree and application with correct coding style --- README.md | 4 +++ app/main.cpp | 6 ----- app/print_tree.cpp | 20 +++++++++++++++ include/add.h | 6 ----- include/search_in_tree.h | 16 ++++++++++++ src/add.cpp | 3 --- src/search_in_tree.cpp | 53 ++++++++++++++++++++++++++++++++++++++++ test/test.cpp | 49 ++++++++++++++++++++++++++++++++++--- 8 files changed, 138 insertions(+), 19 deletions(-) create mode 100644 README.md delete mode 100644 app/main.cpp create mode 100644 app/print_tree.cpp delete mode 100644 include/add.h create mode 100644 include/search_in_tree.h delete mode 100644 src/add.cpp create mode 100644 src/search_in_tree.cpp diff --git a/README.md b/README.md new file mode 100644 index 0000000..8593915 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ + +#Задача по работе с бинарным деревом. +1. Написать функцию поиска в бинарном дереве. Написать тесты. +2. Реализовать приложение, в котором демонтрируется печать бинарного дерева с выводом адресов левого и правого поддеревьев. diff --git a/app/main.cpp b/app/main.cpp deleted file mode 100644 index 4485790..0000000 --- a/app/main.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "add.h" -#include - -int main() { - std::cout << "2 + 2 = " << add(2, 2) << std::endl; -} diff --git a/app/print_tree.cpp b/app/print_tree.cpp new file mode 100644 index 0000000..3616123 --- /dev/null +++ b/app/print_tree.cpp @@ -0,0 +1,20 @@ +#include "search_in_tree.h" +#include + +int main() { + CNode* tree = create_tree_for_tests(); + + std::cout << std::endl << "Tree" << std::endl << std::endl; + print_tree(tree, 3); + std::cout << "" << std::endl; + + std::cout << "Tree with adress" << std::endl << std::endl; + print_tree_with_adress(tree, 3); + CNode** res = find(&tree, 9); + *res = new CNode(9); + CNode* new_search = *(find(&tree, 9)); + std::cout << std::endl << + "Tree with adress after adding an element on found position" + << std::endl << std::endl; + print_tree_with_adress(tree, 3); +} diff --git a/include/add.h b/include/add.h deleted file mode 100644 index ebb1c94..0000000 --- a/include/add.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef INCLUDE_ADD_H_ -#define INCLUDE_ADD_H_ - -int add(int x, int y); - -#endif // INCLUDE_ADD_H_ diff --git a/include/search_in_tree.h b/include/search_in_tree.h new file mode 100644 index 0000000..f06bb36 --- /dev/null +++ b/include/search_in_tree.h @@ -0,0 +1,16 @@ +#ifndef INCLUDE_SEARCH_IN_TREE_H_ +#define INCLUDE_SEARCH_IN_TREE_H_ + +struct CNode { + int val; + CNode* left, *right; + explicit CNode(int v) { val = v; left = 0; right = 0; } +}; + +CNode** find(CNode** root, int v); +void print_tree(CNode* root, int level); +void print_tree_with_adress(CNode* root, int level); +CNode* create_tree_for_tests(); +void PrintTree(CNode** root); + +#endif // INCLUDE_SEARCH_IN_TREE_H_ diff --git a/src/add.cpp b/src/add.cpp deleted file mode 100644 index 35bf82f..0000000 --- a/src/add.cpp +++ /dev/null @@ -1,3 +0,0 @@ -int add(int x, int y) { - return x + y; -} diff --git a/src/search_in_tree.cpp b/src/search_in_tree.cpp new file mode 100644 index 0000000..9e161e0 --- /dev/null +++ b/src/search_in_tree.cpp @@ -0,0 +1,53 @@ +#include +#include +#include "search_in_tree.h" + +CNode** find(CNode** root, int v) { + CNode **tree = root; + while (*tree) { + if ((*tree)->val == v) { + return tree; + } else { + if ((*tree)->val < v) { + tree = &(*tree)->right; + } else { + tree = &(*tree)->left; + } + } + } + return tree; +} + +void print_tree(CNode* root, int level) { + if (root) { + print_tree(root->right, level + 1); + for (int i = 0; i< level; i++) std::cout << " "; + std::cout << root->val << std::endl; + print_tree(root->left, level + 1); + } +} + +void print_tree_with_adress(CNode* root, int level) { + if (root) { + print_tree_with_adress(root->right, level + 1); + for (int i = 0; i< level; i++) std::cout << " "; + std::cout << root->val << std::endl; + for (int i = 0; i< level-1; i++) std::cout << " "; + std::cout << " "; + std::cout << root->left << std::endl; + for (int i = 0; i< level-1; i++) std::cout << " "; + std::cout << " "; + std::cout << root->right << std::endl; + print_tree_with_adress(root->left, level + 1); + } +} + +CNode* create_tree_for_tests() { + CNode* tree = new CNode(5); + tree->left = new CNode(3); + tree->right = new CNode(7); + (tree->right)->left = new CNode(6); + (tree->left)->left = new CNode(1); + (tree->left)->right = new CNode(4); + return tree; +} diff --git a/test/test.cpp b/test/test.cpp index d455327..6094cd3 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -1,9 +1,50 @@ #include -#include "add.h" +#include "search_in_tree.h" -TEST(Addition, CanAddTwoNumbers) { - EXPECT_EQ(add(2, 2), 4); - EXPECT_EQ(add(-2, 2), 0); +TEST(Find, can_find_medium_element) { + CNode* tree = create_tree_for_tests(); + CNode** res = (find(&tree, 3)); + ASSERT_EQ((*res)->val, 3); +} + +TEST(Find, can_find_leaf) { + CNode* tree = create_tree_for_tests(); + CNode** res = (find(&tree, 4)); + ASSERT_EQ((*res)->val, 4); +} + +TEST(Find, return_correct_adress_when_dont_find) { + CNode* tree = create_tree_for_tests(); + CNode** res = (find(&tree, 8)); + CNode* null = 0; + ASSERT_EQ(*res, null); + *res = new CNode(8); + CNode* new_search = *(find(&tree, 8)); + ASSERT_EQ(new_search->val, 8); +} + +TEST(Find, dont_destruct_tree_when_can_find) { + CNode* tree = create_tree_for_tests(); + CNode** res = (find(&tree, 1)); + + ASSERT_EQ(tree->val, 5); + ASSERT_EQ(tree->left->val, 3); + ASSERT_EQ(tree->right->val, 7); + ASSERT_EQ(tree->right->left->val, 6); + ASSERT_EQ(tree->left->left->val, 1); + ASSERT_EQ(tree->left->right->val, 4); +} + +TEST(Find, dont_destruct_tree_when_cant_find) { + CNode* tree = create_tree_for_tests(); + CNode** res = (find(&tree, 9)); + + ASSERT_EQ(tree->val, 5); + ASSERT_EQ(tree->left->val, 3); + ASSERT_EQ(tree->right->val, 7); + ASSERT_EQ(tree->right->left->val, 6); + ASSERT_EQ(tree->left->left->val, 1); + ASSERT_EQ(tree->left->right->val, 4); } int main(int ac, char* av[]) {