1、前序遍历二叉树(借助栈)
void BinTree::PreOrder(BinTreeNode* T)
{
stack<BinTreeNode*> s;
vector<int> result;
BinTreeNode* p=T;
BinTreeNode* r=NULL;
while (p || !s.empty())
{
//遍历左孩子,入栈并访问结点
while(p)
{
s.push(p);
result.push_back(p->data);
p=p->lchild;
}
if (!s.empty()) //出栈
{
p=s.top();
s.pop();//弹出结点
p=p->rchild;//转向右节点
}
}
}
2、中序遍历二叉树(借助栈)
void BinTree::InOrder(BinTreeNode* T)
{
stack<BinTreeNode*> s;
vector<int> result;
BinTreeNode* p=T;
BinTreeNode* r=NULL;
while (p || !s.empty())
{
//先遍历左孩子并入栈
while (p)
{
s.push(p);
p=p->lchild;
}
if (!s.empty()) //出栈,访问结点
{
p=s.top();
s.pop();
result.push_back(p->data);
p=p->rchild;//转向右节点
}
}
}
3、后序遍历二叉树(借助栈,较难理解)
void BinTree::PostOrder(BinTreeNode* T)
{
stack<BinTreeNode*> s;
vector<int> result;
BinTreeNode* p=T;
BinTreeNode* r=NULL;
while(p || !s.empty())
{
if(p) //走到最左边
{
s.push(p);
p=p->lchild;
}
else //向右
{
p=s.top();
if (p->rchild && p->rchild!=r) //存在右结点,且未被访问
{
p=p->rchild;
s.push(p);
p=p->lchild;
}
else //不存在右结点或右结点被访问过
{
p=s.top();
s.pop();
result.push_back(p->data);
r=p;
p=NULL;//重置节点,为什么?
}
}
}
}
4、中序遍历二叉树(借助队列)
void BinTree::SequenceOrder(BinTreeNode* T)
{
queue<BinTreeNode*> q;
vector<int> result;
BinTreeNode* pNode=NULL;
if (T=NULL)
{
return;
}
q.push(T);
while (!q.empty())
{
pNode=q.front();
result.push_back(pNode->data);
if (T->lchild)
{
q.push(T->lchild);
}
if (T->rchild)
{
q.push(T->rchild);
}
q.pop();//删除队头
}
}