#include<stdio.h>
#include<iostream>
#include<malloc.h>
#include<stack>
using namespace std;
typedef struct BTNode
{
char data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode,*BTree;
void CreateBTree(BTree &T)
{
char ch;
ch=getchar();
if(ch=='#')
{
T=NULL;
return;
}
else
{
T=(BTNode*)malloc(sizeof(BTNode));
T->data=ch;
CreateBTree(T->lchild);
CreateBTree(T->rchild);
}
}
void PreOrder(BTree T) // 先序遍历--递归
{
if(T==NULL)
return;
cout<<T->data;
PreOrder(T->lchild );
PreOrder(T->rchild );
}
void Preorder(BTree T) // 先序遍历--非递归
{
if(T==NULL)
return;
BTNode *p=T;
stack<BTree> S;
while(p!=NULL||!S.empty())
{
if(p!=NULL)
{
S.push(p);
cout<<p->data ;
p=p->lchild;
}
else
{
p=S.top();
S.pop();
p=p->rchild;
}
}
}
void InOrder(BTree T) // 中序遍历--递归
{
if(T==NULL)
return ;
InOrder(T->lchild );
cout<<T->data ;
InOrder(T->rchild );
}
void Inorder(BTree T) // 中序遍历--非递归
{
if(T==NULL)
return;
BTNode *p=T;
stack<BTree> S;
while(p!=NULL||!S.empty())
{
if(p!=NULL) //走到最左边
{
S.push(p);
p=p->lchild;
}
else //向右
{
p=S.top(); //取栈顶结点
S.pop();
cout<<p->data ;
p=p->rchild;
}
}
}
void PostOrder(BTree T)
{
if(T==NULL)
return;
PostOrder(T->lchild );
PostOrder(T->rchild );
cout<<T->data ;
}
void Postorder(BTree T) // 先序遍历--非递归
{
if(T==NULL)
return;
BTNode *p=T,*r=NULL;
stack<BTree> S;
while(p!=NULL||!S.empty())
{
if(p!=NULL) //走到最左边
{
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();
cout<<p->data ;
r=p; //指向最近访问过的结点
p=NULL; //结点访问完后,重置p指针
}
}
}
}
void main()
{
BTree T;
printf("递归先序建立二叉树(空节点用#代替):");
CreateBTree(T);
printf("递归先序遍历:");
PreOrder(T);
printf("\n");
printf("非递归先序遍历:");
Preorder(T);
printf("\n");
printf("递归中序遍历:");
InOrder(T);
printf("\n");
printf("非递归中序遍历:");
Inorder(T);
printf("\n");
printf("递归后序遍历:");
PostOrder(T);
printf("\n");
printf("非递归后序遍历:");
Postorder(T);
printf("\n");
}
数据结构--树:二叉树的遍历方式(递归和非递归)
最新推荐文章于 2024-08-12 19:04:41 发布