![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
#include "stdafx.h"
#include "binaryTree.h"
#include<list>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType e))
{
if(IsEmpty(T))
return Ok;
/*
Visit(T->data);
PreOrderTraverse(T->lchild, Visit);
PreOrderTraverse(T->rchild, Visit);
*/
stack<BiTNode *> stack;
BiTNode* t;
stack.push(T);
while(!stack.empty())
{
t = stack.top();
stack.pop();
if(t->rchild != null)
stack.push(t->rchild);
Visit(t->data);
if(t->lchild != null)
stack.push(t->lchild);
}
return Ok;
}
Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType e))
{
if(IsEmpty(T))
return Ok;
stack<BiTNode *> stack;
BiTNode* t;
stack.push(T);
t = T->lchild;
while(!stack.empty())
{
while(t != null)
{
stack.push(t);
t = t->lchild;
}
t = stack.top();
Visit(t->data);
stack.pop();
t = t->rchild;
}
return Ok;
}
Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType e))
{
if(IsEmpty(T))
return Ok;
stack<BiTNode *> stack;
BiTNode* t;
BiTNode* pre = null;
t = T;
while(!stack.empty() || t != null)
{
while(t != null)
{
stack.push(t);
t = t->lchild;
}
t = stack.top();
if(t->rchild == null || t->rchild == pre )
{
Visit(t->data);
stack.pop();
pre = t;
t = null;
}
else
{
t = t->rchild;
}
}
return Ok;
}
Status LevelTraverse(BiTree T, Status (*Visit)(TElemType e))
{
queue<BiTNode *> l;
BiTNode* t;
l.push(T);
while(!l.empty())
{
t = l.front();
if(t->lchild != null)
l.push(t->lchild);
if(t->rchild != null)
l.push(t->rchild);
Visit(t->data);
l.pop();
}
return Ok;
}