二元树中和为某一值的所有路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
我的思路,貌似有点复杂了,用一个vector和stack存储数据,vector输出路径,stack用来保存路径,因为用stack输出就要全部出栈,数据会丢失。
#include <iostream>#include <vector>#include <stack>using namespace std;//节点struct node{node *lchild,*rchild;int value;};//二元查找树class list{public:list();//这里的m_print函数用做递归,print函数相当于外面的一个套子void print(int num);private://将递归函数私有化void m_print(node *p,int value,int num,bool flag);private:node* root;vector<int> v;stack<node*> s;};void list::m_print(node *p,int value,int num,bool flag){if(p==NULL)return;value+=p->value;v.push_back(p->value);s.push(p);//到叶子节点返回if(NULL==p->lchild && NULL==p->rchild){ if(value==num){ if(num==value) for(vector<int>::iterator iter=v.begin();iter!=v.end();iter++) cout<<*iter<<" "; cout<<endl; } v.pop_back(); s.pop(); if(flag==1){ v.pop_back(); s.pop(); } while(1){ if(!s.empty() && !s.top()->rchild){ s.pop(); v.pop_back(); } else break; } return;}//向左右方向递归m_print(p->lchild,value,num,0);m_print(p->rchild,value,num,1);}void list::print(int num){v.clear();m_print(root,0,num,0);}list::list(){cout<<"请输入您要输入的节点,按'#'退出:"<<endl;int i;//用cin.fail(),cin.bad()判断也行if(cin>>i==NULL){ cout<<"您的输入有误"<<endl; exit(-1);}//创建根节点root=new node;root->value=i;root->lchild=NULL;root->rchild=NULL;//建立两个临时节点,p开辟新节点,q为二元查找定位node *p,*q;while(cin>>i!=NULL){//开辟新节点p=new node;p->value=i;p->lchild=NULL;p->rchild=NULL;//二元查找树比较从q=root开始,小则转左,大则转右,如果有位置就插入q=root;while(1){//插入节点小于该节点比较值,左节点为空则插入,否则q=q->lchild继续判断if(p->value<q->value){if(q->lchild)q=q->lchild;else{q->lchild=p;break;}}//插入节点大于该节点比较值,右节点为空则插入,否则q=q->rchild继续判断else if(p->value>q->value){if(q->rchild)q=q->rchild;else{q->rchild=p;break;}}//如果两节点相等,直接退出程序(有些暴力)else{cout<<"node repeated!!"<<endl;exit(-1);}}}}void main(){list test;//这里的print函数打印出所有的根节点到所有叶子节点的长度test.print(22);system("pause");}