Максимальное бинарное дерево (не поиск)

0

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

tnode<int> *maxT(tnode<int> *t)
{
    if (t == NULL) return NULL; 

    tnode<int> *left = maxT(t->left); 
    tnode<int> *right = maxT(t->right); 

    if (left->nodeValue > right->nodeValue)
    {
        return maxT(left);
    }
    if (left->nodeValue < right->nodeValue)
    {
        return maxT(right);
    }

 }
  • 5
    Что если left или right равен NULL ?
  • 0
    Проверьте возвращаемое значение, если t равно NULL, вы должны возвращать NULL?
Показать ещё 1 комментарий
Теги:
max
binary-tree

2 ответа

1

Основы алгоритма довольно прямолинейны. Поскольку дерево неупорядочено, все узлы должны быть посещены со следующими предварительными условиями:

  • Указатель нулевого узла возвращает нуль в качестве ответа.
  • Иначе узел без детей приводит к тому, что текущий узел
  • Другим результатом является максимальный размер узла по сравнению с максимальным количеством его детей.

Учитывая это, я уверен, что это то, что вы пытаетесь сделать:

template<typename T>
tnode<T>* maxT(const tnode<T>* t)
{
    if (!t)
        return nullptr;

    tnode<T>* lmax = maxT(t->left);
    tnode<T>* rmax = maxT(t->right);
    tnode<T>* cmax = (lmax && rmax) 
                   ? ((rmax->nodeValue < lmax->nodeValue ? lmax : rmax))
                   : (lmax ? lmax : rmax);
    return (!cmax || (cmax->nodeValue < t->nodeValue) ? t : cmax);
}
0
tnode<int> *maxT(tnode<int> *t)
{
  if (t->right == NULL && t->left == NULL) //leaf node
    return t->nodeValue;

  else if (t->right == NULL) //no right subtree
    return MAX(t->nodeValue, maxT(t->left))

  else if (t->left == NULL) //no left subtree
    return MAX(t->nodeValue, maxT(t->right))

  else 
    return MAX(maxT(t->right), maxT(t->left));
}

В вашем случае, что произойдет, если узел не имеет права или левого ребенка. Затем либо node-> right == NULL, либо node-> left == NULL. Однако вы пытаетесь получить доступ к left-> nodeValue или right-> nodeValue.

  • 0
    Что эта функция возвращает снова?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню