题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
//二元树中和为某一值的所有路径
#include <iostream>
#include <vector>
using namespace std;
struct BTSTree
{
int value;
BTSTree *m_left;
BTSTree *m_right;
};
//构建二叉查找树
void addTree(BTSTree *&ptr,int value)
{
if (ptr==nullptr)
{
BTSTree *currentptr=new BTSTree();
currentptr->value=value;
currentptr->m_left=nullptr;
currentptr->m_right=nullptr;
ptr=currentptr;
}
else
{
if (ptr->value>value)
{
addTree(ptr->m_left,value);
}
else
{
addTree(ptr->m_right,value);
}
}
}
//查找路径
void FindPath(int expectnum,BTSTree *tree,vector<int>& path,int currentsum)
{
if (tree==nullptr)
{
return;
}
//判断是不是叶节点
bool isleaf=(tree->m_left==nullptr&&tree->m_right==nullptr);
currentsum+=tree->value;//当前路径上节点的和
path.push_back(tree->value);
if (isleaf&¤tsum==expectnum)
{
for (auto it=path.begin();it!=path.end();++it)
{
cout<<*it<<' ';
}
cout<<endl;
cout<<currentsum<<endl;
}
if (!isleaf)
{
//访问左子树
if (tree->m_left)
{
FindPath(expectnum,tree->m_left,path,currentsum);
}
//访问右子树
if (tree->m_right)
{
FindPath(expectnum,tree->m_right,path,currentsum);
}
}
currentsum-=tree->value;//每次遍历完一个节点后都减去其值
path.pop_back();//路径抛出这个节点
}
int main()
{
BTSTree *root=nullptr;
vector<int> path;//用来保存路径
addTree(root,10);
addTree(root,5);
addTree(root,12);
addTree(root,4);
addTree(root,7);
FindPath(22,root,path,0);
return 0;
}