- 前序非递归遍历
PreOrderTraverse(BiTree T)
{
InitStack(S);
p=T;
while (p||!StackEmpty)
{
if(p)
{
print(p);
if(p->rchild)
{
Push(S,p->rchild);
}
p=p->lchild;
}
else
{
Pop(S,p)
}
}
}
- 中序非递归遍历
InOrderTraverse(BiTree T)
{
InitStack(S);
p=T;
while(p||!SatckEmpty)
{
if(p){ Push(S,p); p=p->lchild;}
else{
Pop(S,p);
print(p);
p=p->rchild;
}
}
- 后序非递归遍历
对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问, 因为其右孩子还为被访问。所以接下来按照相同的规则对其右子树进行相同的处理,当访问完其右孩子时,该结点又出现在栈顶,此时可以将其出栈并访问。这样就 保证了正确的访问顺序。可以看出,在这个过程中,每个结点都两次出现在栈顶,只有在第二次出现在栈顶时,才能访问它。因此需要多设置一个变量标识该结点是 否是第一次出现在栈顶。
void postOrder2(BinTree *root) //非递归后序遍历
{
stack<BTNode*> s;
BinTree *p=root;
BTNode *temp;
while(p!=NULL||!s.empty())
{
while(p!=NULL) //沿左子树一直往下搜索,直至出现没有左子树的结点
{
BTNode *btn=(BTNode *)malloc(sizeof(BTNode));
btn->btnode=p;
btn->isFirst=true;
s.push(btn);
p=p->lchild;
}
if(!s.empty())
{
temp=s.top();
s.pop();
if(temp->isFirst==true) //表示是第一次出现在栈顶
{
temp->isFirst=false;
s.push(temp);
p=temp->btnode->rchild;
}
else //第二次出现在栈顶
{
cout<<temp->btnode->data<<" ";
p=NULL;
}
}
}
}
三种递归遍历就很简单了
https://www.cnblogs.com/SHERO-Vae/p/5800363.html
层次遍历:用队列先进先出的特征
inq(Q, T) //根节点先入队
while(队不空)
{
出队
所有孩子节点入队
打印
}