数据结构(六)二叉树的遍历(递归非递归方法)
一、递归方法
1.先序遍历
void PreOrder(BiTree T)
{
visit(T);
PreOrder(T->LChild)
PreOrder(T->RChild)
}
2.先序遍历
void PreOrder(BiTree T)
{
PreOrder(T->LChild)
visit(T);
PreOrder(T->RChild)
}
3.先序遍历
void PreOrder(BiTree T)
{
PreOrder(T->LChild)
PreOrder(T->RChild)
visit(T);
}
二、非递归方法
非递归的方法我们主要采用栈的方法,先进后出
1.中序遍历
void MidSearch01(BiTree T)
{
stack<BitTNode*> p;
while (T || !p.empty())
{
if (T)
{
p.push(T);
T = T->lchild;
}
else
{
T = p.top();
cout << T->data << "\t";
p.pop();
T = T->rchild;
}
}
}
2.先序遍历
//前序遍历(非递归)
void PreSearch01(BiTree T)
{
stack<BitTNode*> p;
while (T || !p.empty())
{
if (T)
{
cout << T->data << "\t";
p.push(T);
T = T->lchild;
}
else
{
T= p.top();
p.pop();
T = T->rchild;
}
}
}
3.后序遍历
后序遍历相对于前中序遍历要麻烦一些
BitTNode* r = NULL;//标记位置
//后序遍历(非递归)
void PostSearch01(BiTree T)
{
stack<BitTNode*> p;
while (T || !p.empty())
{
if (T)
{
p.push(T);
T = T->lchild;
}
else
{
T = p.top();
if (T->rchild && T->rchild != r)
{
T = T->rchild;
p.push(T);
T = T->lchild;
}
else
{
p.pop();
cout << T->data << "\t";
r = T;
T = NULL;
}
}
}
}
4.层次遍历
//层次遍历
void LevelOrder(BiTree T)
{
queue<BitTNode*> q;
q.push(T);
while (!q.empty())
{
T = q.front();
q.pop();
cout << T->data << "\t";
if (T->lchild != NULL)
{
q.push(T->lchild);
}
if (T->rchild != NULL)
{
q.push(T->rchild);
}
}
}