一、题目
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始,一直到叶节点所经过的节点形成一条路径。
二、分析
前序遍历,当访问到某一节点后,把节点添加到路径上,并累加该节点的值。如果该节点为叶节点,并且路径中节点值的和刚好等于输入的整数,则打印路径;若当前节点不是叶节点,则继续访问它的子节点。当前节点访问结束后,递归函数将自动回到它的父节点,因此,我们在函数退出前要在路径上删除当前节点并减去当前节点的值。
三、实现
void findpath(BinaryTreeNode* root,int e)
{
if(pRoot==nullptr)return;
vector<int>path;
int cursum=0;
find(root,path,e,cursum);
}
void find(BinaryTreeNode* root,vector<int> &path,int e,int cursum)
{
cursum+=root->val;
path.push_back(root->val);
bool isleaf=root->left==nullptr&&root->right==nullptr;
if(cursum==e&&isleaf)
{
for(auto it=path.begin();it!=path.end();++it)
{
cout<<*iter<<" ";
}
cout<<endl;
}
if(root->left!=nullptr)find(root,path,e,cursum);
if(root->right!=nullptr)find(root,path,e,cursum);
path.pop_back();
}