Я написал функцию подсчета ветвей - branches(TNode*&, int)
. Работает почти исправно, но если ввести несуществующую вершину, то выдает просто значение для места где бы она должна была располагаться, а нужно вывести, например, -1
. Пытался писать различные условия, ничего не выходит, помогите.
#include "stdafx.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
struct TNode {
int data;
TNode* left;
TNode* right;
};
void add(TNode *&tr, int d) {
if (tr == NULL) {
tr = new TNode;
tr->data = d;
tr->left = tr->right = 0;
}
if (d < tr->data)
add(tr->left, d);
if (d > tr->data)
add(tr->right, d);
}
int branches(TNode *&tr, int n) {
int count = 0, cht = -1;
if (tr == NULL)
return 0;
if (tr->data == n)
return count;
return ++count + branches(((tr->data > n) ? tr->left : tr->right), n);
}
int depth_path(TNode *&tr) {
if (!tr)
cout << "\nДерева не существует\n";
if (tr->left == 0 && tr->right == 0)
return -1;
return 1 + depth_path(tr->left);
}
void tree_print(const TNode* tr) {
if (tr == NULL)
return;
else {
tree_print(tr->left);
cout << tr->data << ' ';
tree_print(tr->right);
}
}
void input_data(TNode *&tr, int dt) {
int n = 0;
cout << "Введите количество элементов: \n"; cin >> n;
while (n--) {
cout << "Введите элемент: "; cin >> dt;
add(tr, dt);
}
}
void del(TNode *&tr) {
if (tr != NULL) {
del(tr->left);
del(tr->right);
delete tr;
tr = NULL;
}
}
int main() {
setlocale(LC_ALL, "rus");
TNode* tree;
int data = 0, temp = 0, n = 0; // n - для подсчета ветвей, темп - для хранения ветвей
tree = NULL;
input_data(tree, data);
cout << endl;
tree_print(tree);
cout << "\nКакую цифру хотите найти: "; cin >> n;
temp = branches(tree, n);
cout << "\nГубилна: " << depth_path(tree);
cout << "\nКоличество ветвей: " << temp << "\n";
del(tree);
system("pause");
return 0;
}
Как я понимаю, проверка
if (tr == NULL)
return 0;
показывает, что нужного узла нет, и пора возвращать -1. Так? Ну так давайте и будем возвращать эту -1:
int branches(TNode *tr, int n) {
int count = 0, cht = -1;
if (tr == NULL)
return -1;
if (tr->data == n)
return count;
int br = branches(((tr->data > n) ? tr->left : tr->right), n);
if (br == -1) return -1;
return ++count + br;
}
(Не компилировал, просто показываю идею).
Еще один вариант - через генерацию исключения, но стоит ли?
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как вывести в файл значения целочисленных переменных x,y,z (здесь z - количество часов, y - количество минут, x - количество секунд) в формате hh:mm:ss...
Я правильно понимаю, что: Библиотека - это набор функций ? Заголовочный файл - это набор прототипов нужных функций из библиотеки ? Стандартная...
Для чего может понадобиться такая конструкция и почему при запросе 0 байт возвращается указатель
Есть два класса - родитель (Capture) и потомок (Camera)В родителе реализована одна общая функция, которая вызывает функцию, переопределённую у потомков: