#дерево #бинарное_дерево #cpp
Подскажите, пожалуйста, как сделать так, чтобы функция проходилась к примеру по всей
левой части дерева?
Я сделал функцию проверки дерева на то, является ли оно почти полным, но при входе
в левое поддерево, функция проверяет не всех потомков.. аналогичная проблема в правом
поддереве
bool PBDPP1 (TNode* ptree, int &cnt)
{
if (ptree != NULL)
{ cnt++;
if(ptree->right != 0 && ptree->left == 0)
return false;
PBDPP1(ptree->left, cnt);
PBDPP1(ptree->right, cnt);
}
else return true;
}
bool PPBD(TNode *rootTree)
{
int cnt1 = 0, cnt2 = 0;
if(rootTree != NULL)
{
if(PBDPP1(rootTree->left, cnt2))
{
if(PBDPP1(rootTree->right, cnt1))
{
int res = cnt2 - cnt1;
if(res >= 0)
return true;
else
return false;
}
}
}
else return false;
}
Напомню, почти полным двоичным деревом называется двоичное дерево, для которого существует
такое целое число h ≥ 0, что:
каждый лист в дереве имеет уровень h или h + 1
если узел дерева имеет правого потомка уровня h + 1, тогда все его левые потомки,
являющиеся листами, также имеют уровень h + 1.
Ответы
Ответ 1
Решение взято от сюда. Предлагается обходить дерево в ширину и на каждом шаге проверять условия: если найден лист то все последующие узлы также листы если узел имеет правого потомка, то он должен иметь и левого. В коде вот так примерно: bool IsAlmostComplete(TNode * root) { std::queuenodes; nodes.push(root); bool leaf_found = false; while(!nodes.empty()) { TNode * node = nodes.front(); nodes.pop(); if(leaf_found && (node->left || !node->right)) return false; // у автора true, думаю он ошибся if(!node->left && !node->right) leaf_found = true; if(node->left && !node->right) return false; if(node->left) nodes.push(node->left); if(node->right) nodes.push(node->right); } return true; }
Комментариев нет:
Отправить комментарий