包含:前序遍历,中序遍历,后序遍历,层序遍历
前序遍历:
//非递归先序遍历: 根左右
void PreOrder(BiTree T){
stack<BiTree> s;
BiTree p = T;
while(p != NULL ||s.empty() == false){//当p的值不为空的时候 或者 栈不空的时候
while(p != NULL){
printf("%c " , p->data);
s.push(p);
p = p->lchild;
}
if(s.empty() == false){
s.pop();
p = p->rchild;
}
}
}
中序遍历:
void InOrder(BiTree T){
stack<BiTree> s;
BiTree p = T;
while(p != NULL || s.empty() == false){
s.push(p);
p = p->lchild;//这个循环里面一路找左结点//
}
//出来的时候一定是没有左结点的//
p = s.top();//此时的栈顶必定是这个左结点的中结点//
s.pop();
printf("%c " , p->data);
p = p->rchild;
}
后序遍历:
void PostOrder(BiTree T){
stack<BiTree> s;
BiTree p , r = NULL;//r的意思是辅助指针,
while(p != NULL || s.empty() == false){
if(p != NULL){
s.push(p);
p = p->lchild;//这个地方和中序遍历一样,一开始直接找最左边的左结点//
}
else{
p = s.top();//指针指回栈顶,当前栈顶是最后的左下角的左指针的中节点
if(p->rchild != NULL && p->rchild != r)//右结点不是空的并且尚未访问过
p = p->rchild;//那么指向这个右结点
else{//说明没有右结点,或者是右结点已经访问过了
s.pop();//弹出这个中结点
printf("%c" , p->data);
r = p;//r指向访问过的右子树根节点//
p = NULL;//到这一步的时候,变成NULL是为了走==NULL分支再给p赋值//
}
}
}
}
层序遍历:
void LevelOrder(BiTree T){
queue<BiTree> q;
BiTree p;
q.push(T);//头节点放进去//
while(q.empty() == false){
p = q.front();
q.pop();
printf("%c " , p->data);
if(p->lchild != NULL){
q.push(p->lchild);
}
if(p->rchild != NULL){
q.push(p->rchild);
}
}
}