在二元树中找出和为某一值的所有路径
算法设计:
1、当访问到某一节点时,把该结点的值添加到当前和变量,且把该结点压vector中。
2、若结点为叶子结点,且当前和变量等于期望的和,则打印vector中的结点值,即为所需的路径。
3、若结点不是叶子结点,继续访问它的左孩子结点,访问它的右孩子结点。
4、删除该结点。包括从当前和变量中减去结点值,从vector中弹出结点值。
#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;
typedef struct node
{
int data;
struct node* lchild;
struct node* rchild;
}BinTree;
void addTree(BinTree **T, int num)
{
if (*T==NULL)
{
(*T)=(BinTree* )malloc(sizeof(BinTree));
(*T)->data=num;
(*T)->lchild=NULL;
(*T)->rchild=NULL;
}
else if((*T)->data < num)
{
addTree((&(*T)->lchild),num);
}
else if ((*T)->data > num)
{
addTree((&(*T)->rchild),num);
}
else
{
cout<<"相同的数据加载"<<endl;
}
}
void findPath(BinTree *T, int total, vector<int> &ivec, int &sum)
{
if (T==NULL)
{
return;
}
sum+=T->data;
ivec.push_back(T->data);
bool isLeaf;
isLeaf=!(T->lchild) && !(T->rchild);
if (isLeaf && total==sum)
{
for(vector<int>::iterator iter=ivec.begin(); iter!=ivec.end(); ++iter)
{
cout<<*iter<<" ";
}
cout<<endl;
}
if (T->lchild)
{
findPath(T->lchild, total, ivec, sum);
}
if (T->rchild)
{
findPath(T->rchild, total, ivec, sum);
}
sum-=T->data;
ivec.pop_back();
}
int main()
{
BinTree* T=NULL;
addTree(&T, 10);
addTree(&T, 12);
addTree(&T, 5);
addTree(&T, 7);
addTree(&T, 4);
vector<int> ivec;
int sum=0;
findPath(T,22,ivec,sum);
return 0;
}

浙公网安备 33010602011771号