summaryrefslogtreecommitdiff
path: root/bin-trees/task18.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'bin-trees/task18.cpp')
-rw-r--r--bin-trees/task18.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/bin-trees/task18.cpp b/bin-trees/task18.cpp
new file mode 100644
index 0000000..e22c7ef
--- /dev/null
+++ b/bin-trees/task18.cpp
@@ -0,0 +1,104 @@
+#include <iostream>
+#include <string>
+
+#include "tree.h"
+
+using namespace std;
+
+// Функция вычисляет расстояние от узла b до узла a снизу вверх.
+// Если цикл достиг корня, то это означает, что либо узел b находится
+// в другой ветке, либо он находится ниже узла a в этой же ветке.
+int length(tree *&a, tree *&b)
+{
+ tree *cur = b;
+ int count = 0;
+ while (cur != a)
+ {
+ if (cur->parent == NULL)
+ {
+ count = -1;
+ break;
+ }
+ else
+ {
+ cur = cur->parent;
+ count++;
+ }
+ }
+ return count;
+}
+
+int solve(tree *&a, tree *&b)
+{
+ int ab = length(a, b);
+ int ba = length(b, a);
+ return max(ab, ba);
+}
+
+void create(tree *&t, int n, tree *parent)
+{
+ if (n > 0)
+ {
+ int x;
+ cin >> x;
+ t = node(x);
+ t->parent = parent;
+
+ int nl = n / 2;
+ int nr = n - nl - 1;
+
+ create(t->left, nl, t);
+ create(t->right, nr, t);
+ }
+}
+
+int main()
+{
+ int n;
+ cout << "Введите количество узлов: ";
+ cin >> n;
+ tree *t = new tree;
+ cout << "Введите содержимое узлов (желательно, уникальные):" << endl;
+ create(t, n, NULL);
+
+ print(t, log(n) / log(2));
+
+ tree *node_a = NULL;
+ {
+ cout << "Введите содержимое узла a: ";
+ int inf_a;
+ cin >> inf_a;
+
+ find(t, inf_a, node_a);
+
+ if (node_a == NULL)
+ {
+ cout << "Узел a не найден в дереве" << endl;
+ return 0;
+ }
+ }
+
+ tree *node_b = NULL;
+ {
+ cout << "Введите содержимое узла b: ";
+ int inf_b;
+ cin >> inf_b;
+
+ find(t, inf_b, node_b);
+
+ if (node_b == NULL)
+ {
+ cout << "Узел b не найден в дереве" << endl;
+ return 0;
+ }
+ }
+
+ int x = solve(node_a, node_b);
+ if (x < 0)
+ cout << "Заданные узлы находятся в разных ветках" << endl;
+ else if (x == 0)
+ cout << "Заданные узлы равны" << endl;
+ else
+ cout << "Длина пути от узла a до узла b равна " << x << endl;
+ return 0;
+}