二叉树遍历分为前序遍历、中序遍历、后序遍历,三种遍历都分递归遍历和非递归遍历。
前序遍历(PreOrderTraverse):
//递归前序遍历C++
void preOrder1(BinTree *root)
{
if(root!=NULL)
{
cout<<root->data<<" ";
preOrder1(root->lchild);
preOrder1(root->rchild);
}
}
//非递归前序遍历C++
void preOrder2(BinTree *root)
{
//使用栈s和一个遍历指针p
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty()) //遍历指针p或者栈s不空
{
while(p!=NULL) //p不空,压栈,然后往左跑
{
cout<<p->data<<" ";
s.push(p);
p=p->lchild;
}
if(!s.empty()) //p遇到NULL,从栈s顶部取一个节点给p,p往右跑一次
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}</span>
中序遍历(InOrderTraverse)
//递归中序遍历
void inOrder1(BinTree *root)
{
if(root!=NULL)
{
inOrder1(root->lchild);
cout<<root->data<<" ";
inOrder1(root->rchild);
}
}
//非递归中序遍历
void inOrder2(BinTree *root)
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
cout<<p->data<<" ";
s.pop();
p=p->rchild;
}
}
}</span>
后序遍历(PostOrderTraverse)
//递归后序便利
void postOrder1(BinTree *root)
{
if(root!=NULL)
{
postOrder1(root->lchild);
postOrder1(root->rchild);
cout<<root->data<<" ";
}
}
//非递归后续遍历2
void postOrder2(BinTree *root) //非递归后序遍历
{
stack<BinTree*> s;
BinTree *cur; //当前结点
BinTree *pre=NULL; //前一次访问的结点
s.push(root);
while(!s.empty())
{
cur=s.top();
if((cur->lchild==NULL&&cur->rchild==NULL)||
(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
{
cout<<cur->data<<" "; //如果当前结点没有孩子结点或者孩子节点都已被访问过
s.pop();
pre=cur;
}
else
{
if(cur->rchild!=NULL)
s.push(cur->rchild);
if(cur->lchild!=NULL)
s.push(cur->lchild);
}
}
}
//非递归后序遍历3
class BTNode{
public:
BinTree *btnode;
bool isFirst;
BTNode():btnode(NULL),isFirst(false){ }
};
void postOrder3(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;
}
}
}
}