Skip to content

Commit

Permalink
Implementation of search function in tree and application with correct
Browse files Browse the repository at this point in the history
coding style
  • Loading branch information
UsovaMA committed Mar 12, 2017
1 parent 69523e8 commit 2189be6
Show file tree
Hide file tree
Showing 8 changed files with 138 additions and 19 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

#Задача по работе с бинарным деревом.
1. Написать функцию поиска в бинарном дереве. Написать тесты.
2. Реализовать приложение, в котором демонтрируется печать бинарного дерева с выводом адресов левого и правого поддеревьев.
6 changes: 0 additions & 6 deletions app/main.cpp

This file was deleted.

20 changes: 20 additions & 0 deletions app/print_tree.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#include "search_in_tree.h"
#include <iostream>

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);
}
6 changes: 0 additions & 6 deletions include/add.h

This file was deleted.

16 changes: 16 additions & 0 deletions include/search_in_tree.h
Original file line number Diff line number Diff line change
@@ -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_
3 changes: 0 additions & 3 deletions src/add.cpp

This file was deleted.

53 changes: 53 additions & 0 deletions src/search_in_tree.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#include <iostream>
#include <queue>
#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;
}
49 changes: 45 additions & 4 deletions test/test.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,50 @@
#include <gtest/gtest.h>
#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[]) {
Expand Down

0 comments on commit 2189be6

Please sign in to comment.