Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2013, 13:07   #1
iamhated
Пользователь
 
Регистрация: 14.11.2011
Сообщений: 12
По умолчанию Проверка элементов в дереве. Язык Си

Определить логическую функцию для данной программы, проверяющую, есть ли в непустом дереве хотя бы два одинаковых символа.
Код:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct node;

typedef char tree_data;
typedef node * link;

struct node {
    tree_data data;
    link r;
    link l;
};

link q;
int i, k, n, c;
char ch;
static int leaf_level, flowing_level, result, b; //для action ()

void insert_tree (link &, int);
void del (link &);
void delete_tree (link &, tree_data);
void print_tree (link);
int action (link);

int main () {
    srand (time(0));
    link tree = 0;
    for (;;) {
        printf (
        "\n            MENU :"
        "\n0. Exit"
        "\n1. Generation random binary tree"
        "\n2. Add to tree"
        "\n3. Delete node"
        "\n4. Print tree"
        "\n5. Execute action"             
        "\n\nInput number ==> "); 
        scanf("%d", &k);
        switch (k) {
            case 0 :
                printf ("\nProgram close\n");
                return 0;
            case 1 : 
                printf ("\nInput number of elements in the tree ==> ");
                scanf ("%d", &n);
                for (i = 0; i < n; i++) {
                    c = 'a' + rand() % ('z' - 'a');
                    insert_tree (tree, c);
                }
                break;
            case 2 :
                printf ("\nWhich item to add ? ==> ");
                scanf (" %c", &ch);
                insert_tree (tree, ch);
                break;
            case 3 :
                if (tree) {
                    printf ("\nWhich item to delete ? ==> ");
                    scanf (" %c", &ch);
                    delete_tree (tree, ch);
                }
                else 
                    printf ("\nNot tree");
                break;
            case 4 :
                if (tree) {
                    printf ("\nBinary tree : \n\n");
                    print_tree (tree);
                }
                else
                    printf ("\nNot tree");
                break;
            case 5 :
                if (tree) {
                    leaf_level = 0; flowing_level = 0; result = 0; b = 1;
                    n = action (tree);
                    if (n)
                        printf ("\nAll the leaves of a tree are " 
                                "located on the %d level\n", n);
                    else
                        printf ("\nThe leaves of a tree are "
                                "located on different levels\n");
                }
                else
                    printf ("\nNot tree");
                break;
        }    
    }
    return 0;
}

void insert_tree (link &t, int d) {
    if (t) {
        if (t->data < d)
            insert_tree (t->r, d);
        else if (t->data > d)
            insert_tree (t->l, d);
    }
    else {
        t = new node;
        t->data = d;
        t->r = 0;
        t->l = 0;
    }   
}

void delete_tree (link &t, tree_data v) { 
    if (t)
        if(v < t->data) 
            delete_tree (t->l, v);
        else if (v > t->data) 
            delete_tree (t->r, v);
        else if (!(t->r))
            t = t->l;
        else if (!(t->l)) 
            t = t->r;
        else { 
            q = t; 
            del (q->l);
        }
}

void del (link &t) { 
    if (t->r)
        del (t->r);
    else { 
        q->data = t->data;
        q = t;
        t = t->l;
    }
}

void print_tree (link t) {
    static int s = 0;
    s++;
    if (t) {
        print_tree(t->r);
        for (i = 0; i < s; i++)
            printf ("   ");
        if ((t->l) || (t->r))
            printf ("\\__%c\n", t->data);
        else    //листья распечатаем в круглых скобках (для удобства)
            printf ("\\__(%c)\n", t->data);
        print_tree(t->l);
    }
    s--;
}

int action (link t) {
    if (t) {
        flowing_level++;
        action (t->r);
        if (!(t->r) && !(t->l)) {
            leaf_level = flowing_level;
            if ((result != 0) && (result != leaf_level)) {
                b = 0;
                return 0;
            }
            else if (result == 0)
                result = leaf_level;
        }
        action (t->l);
        flowing_level--;
    }
    if (b)
        return result;
    else
        return 0; 
}
iamhated вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно написать функцию, которая проверяет содержатся ли элементы из первого дерева во втором дереве, в указанном в 1 дереве порядк Laurensii Помощь студентам 2 24.12.2012 02:55
Проверка элементов в соответствии с заданной точностью.( язык Си). NNAndr Помощь студентам 1 03.12.2012 18:03
количество элементов в бинарном дереве поиска CodeNOT Общие вопросы C/C++ 2 07.12.2011 19:11
Записать в массив Z подряд семь нулевых элементов массива R,состоящего из N элементов.(Язык QBasic) Лиза) Помощь студентам 0 11.01.2011 16:02