Я получаю ошибку сегментации с моим кодом, и я не уверен, почему. Я пытаюсь найти максимальное значение в обычном двоичном дереве, которое не упорядочено.
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);
}
}
Основы алгоритма довольно прямолинейны. Поскольку дерево неупорядочено, все узлы должны быть посещены со следующими предварительными условиями:
Учитывая это, я уверен, что это то, что вы пытаетесь сделать:
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);
}
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.
left
илиright
равенNULL
?