递归前序
void pre(BinTree BT){
if(BT{
cout<<BT->Data<<endl;
pre(BT->lchild);
pre(BT->rchild);
}
}
中序后序换一下
层序遍历(每出队一个结点就判断它是否有左右孩子,如果有就入队)
void floor(BinTree BT){
queue<BinTree>q;
BinTree T;
if(BT){
q.push(BT); //首先先把根结点入队
while(q.size()!=0){ //队列不为空
T=q.front(); //先保存下出队元素
cout<<q.front()<<endl;
q.pop(); //输出然后出队
if(T->lchild){
q.push(T->lchild);
}
if(T->rchild){
q.push(T->rchild);
}
}
}
然后是前中后非递归遍历(需要使用栈)
void pre(BinTree BT){ //前序直接按照放入栈的顺序输出就行
stack<BinTree>s;
BinTree p=BT;
while(p!=NULL||s.size()!=0){ //只有当前结点空且栈中无元素时结束遍历
if(p!=NULL){ //结点不为空就放进栈里
cout<<p->Data<<endl;
s.push(p);
p=p->lchild; //先看看左边
}else{ //结点为空需要返回上一个结点然后看看右边
p=s.pop();
p=p->rchild;
}
}
}
中序遍历把输出语句插到p=s.pop()和p=p->rchild之间
后序遍历
BinTree p=BT;
BinTree r=NULL; //r结点证明已经遍历过了
stack<BinTree>s;
while(p!=NULL||s.size()!=0){
if(p!=NULL){
s.push(p);
p=p->Left;
}else{
p=s.top(); //与前序中序不同的是需要先判断栈顶右子树是否已经遍历过再将其出栈输出
if(p->rchild==NULL||r==p->rchild){ //没有右子树或右子树已遍历则输出
s.pop();
cout<<p->Data<<endl;
r=p; //设置该结点为已遍历
p=NULL; //看看如果没有这行会发生什么
}else{ //否则遍历右边
p=p->Right;
}
}
}