最近在写数据结构中二叉树的遍历,这里总结一下:
先序递归遍历:
void PreTravel(BiTree T)
{//前序递归遍历
if(T)
{
printf("%c",T->data);
PreTravel(T->lchild);
PreTravel(T->rchild);
}
}
中序递归遍历:
void MidTravel(BiTree T)
{//中序递归遍历
if(T)
{
MidTravel(T->lchild);
printf("%c",T->data);
MidTravel(T->rchild);
}
}
后序递归遍历:
void PostTravel(BiTree T)
{//后序递归遍历
if(T)
{
PostTravel(T->lchild);
PostTravel(T->rchild);
printf("%c",T->data);
}
}
先序非递归遍历:
void PreOrder(BiTree &T)
{//先序非递归遍历
stack<BiTree> s;
BiTree p = T;
while(p || !s.empty())
{
if(p)
{
printf("%c", p->data);
s.push(p);
p = p->lchild;
}
else
{
p = s.top();
s.pop();
p = p->rchild;
}
}
}
中序非递归遍历:
void InOrder(BiTree T)
{//中序非递归遍历
stack<BiTree> s;
BiTree p = T;
while(p || !s.empty())
{
if(p)
{
s.push(p);
p = p->lchild;
}
else
{
p = s.top();
printf("%c", p->data);
s.pop();
p = p->rchild;
}
}
}
后序非递归遍历:
void PostOrder(BiTree &T)
{//后序非递归遍历(加入一个标志变量visit,判断左右子树是否进栈)
stack<BiTree> s;
BiTree p = T;
p->visit = false;
if(T) s.push(T);
while(!s.empty())
{
p = s.top();
if(p->visit)
{
printf("%c", p->data);
s.pop();
}
else
{
if(p->rchild)
{
p->rchild->visit = false;
s.push(p->rchild);
}
if(p->lchild)
{
p->lchild->visit = false;
s.push(p->lchild);
}
p->visit = true;
}
}
}
void PostOrder1(BiTree &T)
{//后序非递归遍历 (销毁了树的结构,不可取)
stack<BiTree> s;
BiTree q, p = T;
while(p || !s.empty())
{
if(p)
{
s.push(p);
q = p;
p = q->lchild;
q->lchild = NULL;
}
else
{
q = s.top();
p = q->rchild;
q->rchild = NULL;
if(p)
{
s.push(p);
q = p;
p = q->lchild;
q->lchild = NULL;
}
else
{
p = s.top();
printf("%c", p->data);
s.pop();
if(!s.empty())
{
p = s.top();
p = p->lchild;
}
else return;
}
}
}
}
层序遍历:
void LevelOrder(BiTree &T)
{//层序遍历
queue<BiTree> q;
q.push(T);
BiTree p;
while(!q.empty())
{
p = q.front();
printf("%c", p->data);
q.pop();
if(p->lchild)
q.push(p->lchild);
if(p->rchild)
q.push(p->rchild);
}
}
主函数调用:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <queue>
#include "constant.h"
using namespace std;
typedef struct BiTNode
{
char data;
bool visit;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void Print(char a)
{
printf("%c", a);
return;
}
void CreatBiTree(BiTree &T)
{//前序法创建二叉树
char ch;
if((ch=getchar())=='#')
T=NULL;
else
{
T=(BiTNode*)malloc(sizeof(BiTNode));
if(!T)
exit(1);
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
void PreTravel(BiTree T)
{//前序递归遍历
if(T)
{
printf("%c",T->data);
PreTravel(T->lchild);
PreTravel(T->rchild);
}
}
void MidTravel(BiTree T)
{//中序递归遍历
if(T)
{
MidTravel(T->lchild);
printf("%c",T->data);
MidTravel(T->rchild);
}
}
void PostTravel(BiTree T)
{//后序递归遍历
if(T)
{
PostTravel(T->lchild);
PostTravel(T->rchild);
printf("%c",T->data);
}
}
void PreOrder(BiTree &T)
{//先序非递归遍历
stack<BiTree> s;
BiTree p = T;
while(p || !s.empty())
{
if(p)
{
printf("%c", p->data);
s.push(p);
p = p->lchild;
}
else
{
p = s.top();
s.pop();
p = p->rchild;
}
}
}
void InOrder(BiTree T)
{//中序非递归遍历
stack<BiTree> s;
BiTree p = T;
while(p || !s.empty())
{
if(p)
{
s.push(p);
p = p->lchild;
}
else
{
p = s.top();
printf("%c", p->data);
s.pop();
p = p->rchild;
}
}
}
void PostOrder(BiTree &T)
{//后序非递归遍历(加入一个标志变量visit,判断左右子树是否进栈)
stack<BiTree> s;
BiTree p = T;
p->visit = false;
if(T) s.push(T);
while(!s.empty())
{
p = s.top();
if(p->visit)
{
printf("%c", p->data);
s.pop();
}
else
{
if(p->rchild)
{
p->rchild->visit = false;
s.push(p->rchild);
}
if(p->lchild)
{
p->lchild->visit = false;
s.push(p->lchild);
}
p->visit = true;
}
}
}
void PostOrder1(BiTree &T)
{//后序非递归遍历 (销毁了树的结构,不可取)
stack<BiTree> s;
BiTree q, p = T;
while(p || !s.empty())
{
if(p)
{
s.push(p);
q = p;
p = q->lchild;
q->lchild = NULL;
}
else
{
q = s.top();
p = q->rchild;
q->rchild = NULL;
if(p)
{
s.push(p);
q = p;
p = q->lchild;
q->lchild = NULL;
}
else
{
p = s.top();
printf("%c", p->data);
s.pop();
if(!s.empty())
{
p = s.top();
p = p->lchild;
}
else return;
}
}
}
}
void LevelOrder(BiTree &T)
{//层序遍历
queue<BiTree> q;
q.push(T);
BiTree p;
while(!q.empty())
{
p = q.front();
printf("%c", p->data);
q.pop();
if(p->lchild)
q.push(p->lchild);
if(p->rchild)
q.push(p->rchild);
}
}
int main()
{
BiTree T;
printf("please input the bitree:\n" );
CreatBiTree(T);
printf("The Pretravel is:\n");
PreTravel(T);
printf("\n");
PreOrder(T);
printf("\n");
printf("The Midtravel is:\n");
MidTravel(T);
printf("\n");
InOrder(T);
printf("\n");
printf("The PostTravel is:\n");
PostTravel(T);
printf("\n");
PostOrder(T);
printf("\n");
printf("The LevelTravel is:\n");
LevelOrder(T);
printf("\n");
PostOrder1(T);
printf("\n");
return 0;
}