剑指Offer之面试题25:二叉树中和为某一值的路径

时间:2021-03-13 20:33:53


所有代码均通过G++编译器测试,仅为练手纪录。


//面试题25:二叉树中和为某一值的路径

//题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。

//    从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。


//面试题25:二叉树中和为某一值的路径
//题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
// 从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

bool TreeFindPathImpl(BinTreeNode *pRoot,int nExpectedSum,vector<int>& vecPath,int nCurSum)
{
nCurSum += pRoot->m_nValue;
vecPath.push_back(pRoot->m_nValue);

bool bFind = false;
bool bLeaf = (NULL == pRoot->m_pLeft) && (NULL == pRoot->m_pRight);
if(bLeaf && nCurSum == nExpectedSum)
{
LogInfo("Find path:");
vector<int>::iterator vecIter = vecPath.begin();
for (; vecIter != vecPath.end(); ++vecIter)
{
LogInfo("value:%d",*vecIter);
}
bFind = true;
}

if(NULL != pRoot->m_pLeft)
{
bFind |= TreeFindPathImpl(pRoot->m_pLeft, nExpectedSum, vecPath, nCurSum);
}

if(NULL != pRoot->m_pRight)
{
bFind |= TreeFindPathImpl(pRoot->m_pRight, nExpectedSum, vecPath, nCurSum);
}

vecPath.pop_back();

return bFind;

}

bool TreeFindPath(BinTreeNode *pRoot,int nExpectedSum)
{
if(NULL == pRoot)
{
return false;
}

int nCurSum = 0;
vector<int> vecPath;

return TreeFindPathImpl(pRoot,nExpectedSum,vecPath,nCurSum);
}

ZhaiPillary

2017-01-07