Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- struct Node {
- int data;
- Node *left;
- Node *right;
- };
- int max_tree = 0, lvl = 0;
- Node *search_tree = nullptr;
- void push(Node *uz) {
- int gl, gr;
- Node *tmpl = new Node;
- cin >> gl;
- if ((gl) != 0) {
- tmpl->data = gl;
- tmpl->left = nullptr;
- tmpl->right = nullptr;
- uz->left = tmpl;
- push(tmpl);
- } else {
- tmpl = nullptr;
- uz->left = tmpl;
- }
- Node *tmpr = new Node;
- cin >> gr;
- if (gr != 0) {
- tmpr->data = gr;
- tmpr->left = nullptr;
- tmpr->right = nullptr;
- uz->right = tmpr;
- push(tmpr);
- } else {
- tmpr = nullptr;
- uz->right = tmpr;
- }
- if (gl * gr != 0) lvl++;
- }
- void add(Node *root) {
- cout << "введите корень(0)" << endl;
- cin >> (root->data);
- root->left = nullptr;
- root->right = nullptr;
- cout << "вводите вершины('0' означает NULL)" << endl;
- push(root);
- }
- int search(Node *root, int root_value) {
- //Если это пустая вершина то из неё есть дерево поиска размера 0
- if (root) {
- int counter = 1;
- int left = search(root->left, min(root_value, root->data)), right = search(root->right, max(root_value, root->data));
- if (root->left) {
- if (root->left->data < root->data && root->left->data < root_value)
- if (root->right) {
- if (root->right->data >= root->data && root->right->data > root_value)
- counter += left + right;
- } else
- //Если нет правого сына то только на левом
- counter += left;
- }
- else if (root->right)
- //Иначе только на правом
- if (root->right->data >= root->data && root->right->data > root_value)
- counter += right;
- //Если полученное дерево больше найденного ранее - запоминаем его
- if (counter > max_tree) {
- max_tree = counter;
- search_tree = root;
- }
- return counter;
- } else return 0;
- }
- void print(Node *root, int root_value) {
- if (root) {
- if (root->left) {
- if (root->left->data >= root->data) {
- root->left = nullptr;
- }
- }
- if (root->right) {
- if (root->right->data < root->data) {
- root->right = nullptr;
- }
- }
- print(root->left, min(root->data, root_value));
- cout << root->data << ' ';
- print(root->right, min(root->data, root_value));
- }
- }
- int main() {
- setlocale(LC_ALL, "rus");
- Node* root = new Node;
- add(root);
- search(root, root->data);
- print(search_tree, root->data);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement