Помогите пожалуйста найти ошибку в фунццие

Тема в разделе "C/C++/C#", создана пользователем Lotti, 28 фев 2010.

  1. Lotti

    Lotti Гость

    К сожалению моя прога не прошла тесты, но в чем именно ошибки естественно не показывает)) У меня такое подозрение, что глючит прогу именно на удалении узла... Так что, помогите, кто может и кому не лень потратить время на бедную студентку) Подскажите, есть ли вооще в моей функции ошибка и если есть, тогде)
    Код (Text):
        void Del(int key)
    {
    Element* E= Find(key);//ищим, есть ли такой элемент
    if(E==NULL)
    return;
    else
    {
    if(E->left==NULL&&E->right==NULL)//если нет сыновей узла(лист), просто его отрезаем
    {
    if(E!=root)//если это не корень
    {
    if(E==E->p->left)//если это левый сын
    E->p->left=NULL;//то у предка зануляем ссылку на левого сына
    else
    E->p->right=NULL;//иначе на правого
    }
    else root=NULL;//если это был корень,то тазуляем его
    }
    if(E->left==NULL&&E->right!=NULL)//если у удаляемого узла есть правй сын, но нет левого
    {
    if(E!=root)//если это не корень
    {
    E->p->right=E->right;// правым сыном у предка делаем правого сына      //удаляемого узла...т.е. как бы вырезаем его просто..
    }
    else//если это был корень
    {
    root=E->right;// вместо корня ставим его правого сына
    }

    }
    if(E->left!=NULL&&E->right==NULL)// если есть только левый
    {
    if(E!=root)//если не корень
    E->p->left=E->left;// вырезаем его
    else // если корень
    {
    root=E->left;//делаем корнем его единственног сына

    }
    }
    if(E->left!=NULL&&E->right!=NULL)// если есть и правый и левый сын
    {
    Element* E1= new Element();//создаем новый элемент
    E1=E->right;// спускаемся на 1 узел вправо
    while(E1->left!=NULL)// а потом до конца в лево...ну так походу по алгоритму //правого удаления
    E1=E1->left;
    int i=E1->key;//берем ключ у найденой вершины
    Del(i);//удаляем ее
    E->key=i;// у у той, которую надо удалить, заменяем ключ...ну это место того, //чтобы на ее место поставить найденую)
    }

    }

    }
    а вот то, что здесь используется...если надо)

    Код (Text):
    struct Element
    {
    int key;// ключ узла
    int depth;//глубина узла
    Element *p;//предок
    Element *left;//левый сын
    Element *right;// правый сын
    Element(int k)
    {
    key=k;
    depth=-1;
    left= right=p=NULL;
    }
    Element()
    {
    key=0;
    depth=-1;
    left= right=p=NULL;
    }
    };



    Element* Find(int k)
    {
    Element *x=root;
    while (x!=NULL)
    {
    if(x->key==k)
    return x;
    else
    {
    if(x->key>k)
    x=x->left;
    if(x->key<k)
    x=x->right;
    }
    }
    return x;
    }
    Зарание спасиьбо)
    p.s. Забыла как делать код в окнах с вертикальным скролам, может напомните?)))
    р.р.s А еще, если не сложно, можете придумать какие-нибудь тесты посложнее, а то я не могу вылавить ошибки, потому что все мои тетсты прога проходит...а в системе нет...
    задание:
    Найти такой путь максимальной длины между вершинами дерева, у которого сумма ключей конечных вершин минимальна. Удалить (правым удалением) корневую вершину этого пути.
     
  2. sg^_^milytia

    sg^_^milytia Гость

    код заключать в теги [соde] ... [/соde]

    будь добра опиши задание и выложи весь код, тогда я попробую помоч, тут вродебы все правильно.
     
  3. Lotti

    Lotti Гость

    Все, нашлось все, что было неправильно (ошибки в этой функцие есть))), все испраилось и мега-тастер принял таки мою задачу) Так что вопрос снимается)
     
Загрузка...
Похожие Темы - Помогите пожалуйста найти
  1. OlgaZag
    Ответов:
    1
    Просмотров:
    1.291
  2. OlgaZag
    Ответов:
    0
    Просмотров:
    523
  3. Lizzz
    Ответов:
    3
    Просмотров:
    1.382
  4. Oleg333
    Ответов:
    0
    Просмотров:
    1.336
  5. limbra
    Ответов:
    3
    Просмотров:
    44

Поделиться этой страницей