Если есть другой способ, которым я все уши!
Рассмотрим:
a) передать «вектор TreeNodes» в качестве второго параметра в ваш метод Ancestors () ,
b) Во время рекурсивного поиска (сначала я использовал глубину), используйте push_back в векторе, чтобы ЗАХВАТИТЬ посещаемых предков (узел *) во время поиска,
c) и когда значение будет найдено, верните интересующего предка.
d) Если не найден (в текущей ветви), используйте pop_back во время «удаления проклятия», чтобы удалить нежелательный узел (узлы) предка.
Я использовал эту технику, чтобы найти узлы, которые суммируются с целью.
Пример вывода: (поиск узлов, сумма которых равна -5)
BTree_t::dfVisitSum(-5)
@ level 3: -2 -3
@ level 2: 0 -2 -3
В дереве: (т.е. тестовый ввод)
BTree_t::showTallView(): (balance: 0 sz: 19)
-3
-2
-1
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
42
// target-sum-search
int Node_t::sumSearch(const int targetSum, NVec_t& nodeLog)
{
int reportCount = 0;
// diag only std::cout << " Node_t::sumSearch() " << m_payLoad << std::endl;
// CAPTURE visit to log
nodeLog.push_back(this); // trace node route (depth-first-search style)
if(m_left)
{
reportCount += m_left->sumSearch(targetSum, nodeLog); // RECURSE
}
{
size_t startLvl = nodeLog[0]->m_lvl; // used in report
int accumulateSum = 0;
for (size_t i = 0; i < nodeLog.size(); ++i)
accumulateSum += nodeLog[i]->m_payLoad;
if (targetSum == accumulateSum)
{
std::stringstream reportLabelSS;
reportLabelSS << "\n @ level " << startLvl << ":";
std::cout << showNVec(nodeLog, reportLabelSS.str());
reportCount += 1;
}
}
if(m_right)
{
reportCount += m_right->sumSearch(targetSum, nodeLog); // RECURSE
}
// REMOVE this node visit from log
nodeLog.pop_back(); // removes last nodeLog element // DE-CURSE
return(reportCount); // report count
}