要输出所有的路径,必须额外用一个栈来保存当前路径信息。
当访问到节点A时,节点A的信息要在访问A的左右子树时用到,因而,该信息必须在遍历A的左右子树前加入到栈中,而在遍历完A的左右子树后从栈中移除。
每访问一个节点,就计算当前路径值(可直接利用父节点的路径值),当其等于给定值且当前节点是叶子节点时,就打印路径信息。
void FindPath(BTNode* bt,int find,vector<int>vec)
{
int num = 0;
if(bt == NULL)
{
return ;
}
num += bt->data;
vec.push_back(bt->data);
if(bt->lchild == NULL&&bt->rchild&&num == find)
{
for(vector<int>::iterator iter = vec.begin();iter != vec.end();++iter)
{
cout<<*iter<<endl;
}
}
if(bt->lchild != NULL)
{
FindPath(bt->lchild,find,vec);
}
if(bt->rchild != NULL)
{
FindPath(bt->rchild,find,vec);
}
vec.pop_back();
num -= bt->data;
}