输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
算法思路: 先序遍历二叉树,并用一个vector模拟一个栈,记录路径,将访问过的结点的值放入,遍历的时候先计算当前路径上结点值的总和,并将结点的值放入vector,然后判断当前结点是否是叶子节点并且当前路径总和的值是否与要找的值相等,相等则打印vector中的数据。如果当前结点不是叶子节点,遍历它的左右子树,最后在每个结点返回父节点之前在当前路径上删除此结点。
#include <iostream>
#include <vector>
using namespace std;
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode * m_pLeft;
BinaryTreeNode * m_pRight;
};
void FindPathInTree(BinaryTreeNode* pRoot,int expectedSum)
{
if(pRoot==NULL)
return;
//使用一个vector来模拟栈,保存路径
vector<int> path;
int currentSum=0;
}
void FindPath(BinaryTreeNode* pRoot,int expectedSum,vector<int> & path,int currentSum)
{
//1.将结点的值放入vector
path.push_back(pRoot->m_nValue);
//2.当前值加上当前结点的值,计算当前路径的和
currentSum=currentSum+pRoot->m_nValue;
//3.判断当前结点是否是叶节点
bool isLeaf=pRoot->m_pLeft==NULL&&pRoot->m_pRight==NULL;
//4.判断当前路径上结点的和与期望的值是否相等,并且结点是叶节点
if(currentSum==expectedSum&&isLeaf==true)
{
//打印出vector中的值
vector<int>::iterator iter=path.begin();
for(;iter!=path.end();++iter)
{
cout<<*iter<<endl;
}
}
//5.如果结点不是叶节点,遍历结点的左右子树
if(pRoot->m_pLeft!=NULL)
{
FindPath(pRoot->m_pLeft,expectedSum,path,currentSum);
}
if(pRoot->m_pRight!=NULL)
{
FindPath(pRoot->m_pRight,expectedSum,path,currentSum);
}
//6.返回父节点之前,在路径上删除当前结点
path.pop_back();
}