Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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