void print(int num);
private:
//将递归函数私有化
void m_print(node *p,int value,int num,bool flag);
private:
node* root;
vector
stack
};
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){
for(vector
cout<<*iter<<" ";
cout<
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<<"请输入您要输入的节点,按'#'退出:"<
//用cin.fail(),cin.bad()判断也行
if(cin>>i==NULL){
cout<<"您的输入有误"<
}
//创建根节点
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
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!!"<
}
}
}
}
void main()
{
list test;
//这里的print函数打印出所有的根节点到所有叶子节点的长度
test.print(22);
system("pause");
}