非递归非栈先序遍历的伪代码,搞不懂count作用的可以自己简单模拟一遍,反正我是小菜鸡,高端的食材往往只需要最简单的控制方式。核心思想就是:根——>左——>右
void PreOrder(BiTree T){
BiTree p=T; //遍历指针
int count=0; //控制每个结点只输出一次
while(p!=NULL&&p->visited==false){ //当前结点非空且未被访问过
if(count==0){
print(p); //输出当前结点
count++;
}
if(p->lchild!=NULL&&p->lchild->visited==false){ //遍历左子树
p=p->lchild;
count--;
}
else if(p->rchild!=NULL&&p->rchild->visited==false){ //遍历右子树
p=p->rchild;
count--;
}
else{ //左子树和右子树都不用再遍历了(要么为空要么已经遍历过),逻辑删除该结点
p->visited=true; //使该结点以后不用再遍历
p=p->parent; //回溯到父节点
}
}
}
非递归非栈中序遍历的伪代码,核心思想就是:左——>根——>右
void InOrder(BiTree T){
BiTree p=T;
while(p!=NULL&&p->visited==false){
if(p->lchild!=NULL&&p->lchild->visited==false)
p=p->lchild;
else if(p->rchild!=NULL&&p->rchild->visited==false)
p=p->rchild;
else{
if(p->lchild==NULL||p->lchild->visited==true)//当该结点左子树都访问过或者为空时
print(p); //可以输出该结点
if(p->rchild==NULL||p->rchild->visited==true){//当该结点右子树都访问过或者为空时
p->visited=true; //可以逻辑删除该结点
p=p->parent; //并回溯到父节点,由于是逻辑删除因此不用担心断链的问题
}
}
}
}
非递归非栈后序遍历的伪代码,核心思想就是:左——>右——>根
void PostOrder(BiTree T){
BiTree p=T;
while(p!=NULL&&p->visited==false){
if(p->lchild!=NULL&&p->lchild->visited==false)
p=p->lchild;
else if(p->rchild!=NULL&&p->rchild->visited==false)
p=p->rchild;
else{ //遍历到最左子树的最后一个应该输出的结点
print(p); //输出该结点
p->visited=true; //逻辑删除该结点
p=T; //从根节点重新开始遍历
}
}
}