在二元树中找出和为某一值的所有路径
算法设计:
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; }