二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后续遍历实现起来相对来说要难一点。
一.前序遍历
1.递归实现
void preOrder1(BinTree *root)
{
if(root!=NULL)
{
cout<<root->data<<" ";
preOrder1(root->lchild);
preOrder2(root->rchild);
}
}
2.非递归实现
思路:
1)访问节点平,并将节点p入栈;
2)判断p的左孩子是否为空,若为空,则取栈顶节点并进行出栈,并将栈顶节点的右孩子设为当前节点p,循环1),再将p的左孩子作为当前节点p;
3)直到p为空且栈为空,遍历结束;
void preOrder2(BinTree *root)
{
stack<BinTree *> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
cout<<p->data<<" ";
s.push(p);
p=p->lchild;
}
while(!s.empty())
{
p=s.top();
s.pop();
p=p->rchild;
}
}
二.中序遍历
1.递归遍历
void Inorder1(BinTree* root)
{
while(root!=NULL)
{
Inorder1(root->lchild);
cout<<root->data<<" ";
Inorder2(root->rchild);
}
}
2.非递归实现
void Inorder2(BinTree* root)
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
s.push(p);
p=p->lchild;
}
while(!s.empty())
{
p=s.top();
cout<<p->data<< " ";
s.pop();
p=p->rchild;
}
}
三 后序遍历
1.递归遍历
void postOrder1(BinTree *root) //递归后序遍历
{
if(root!=NULL)
{
postOrder1(root->lchild);
postOrder1(root->rchild);
cout<<root->data<<" ";
}
}