二叉树的先序遍历(C语言)
以完全二叉树为例,其中的先序遍历函数也可以运用到别的树。
//先序遍历的非递归算法(函数)
int PreOrder(BiTree T)
{
BiTree p, stack[MAXSIZE];
int top=0;
p=T;
if(T=NULL)
{
printf("二叉树为空\n");
return 0;
}
while(p||top!=0)
{
while(p)
{
printf("%5d",p->data);
stack[++top]=p;
p=p->lchild;
}
if(top!=0)//栈不为空,出栈 访问右孩子
{
p=stack[top--];
p=p->rchild;
}
}
return 1;
}
//先序遍历的递归算法(函数)
void PreOrder(BiTree T)
{
if(T!=NULL)
{
printf("%d",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
下面是完整程序
递归和非递归算法都放在了里面,使用时可以根据要求更改
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 100
//二叉树的类型定义
typedef int Elemtype;
typedef struct BitNode{
Elemtype data;
struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
//创建二叉链表(这里直接写了一个完全二叉树的创建)
int CreatTree (BiTree &T)
{
BiTree s[MAXSIZE],q;
int i,x,j;
T=NULL;
printf("输入i,x直到为0为止:\n");
scanf("%d%d",&i,&x);
while(i!=0&&x!=0)
{
q=(BiTree)malloc(sizeof(BitNode));
q->data=x;
q->lchild=NULL;
q->rchild=NULL;
s[i]=q;
if(i==1)
T=q;
else
//i不为1,判断其父节点是谁,偶数连到左孩子 奇数连到右孩子
{
j=i/2;
if(i%2==0)
s[j]->lchild=q;
else
s[j]->rchild=q;
}
scanf("%d%d",&i,&x);
}
return 1;
}
//先序遍历的递归算法
/*void PreOrder(BiTree T)
{
if(T!=NULL)
{
printf("%d",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
} */
//先序遍历的非递归算法
int PreOrder(BiTree T)
{
BiTree p, stack[MAXSIZE];
int top=0;
p=T;
if(T=NULL)
{
printf("二叉树为空\n");
return 0;
}
while(p||top!=0)
{
while(p)
{
printf("%5d",p->data);
stack[++top]=p;
p=p->lchild;
}
if(top!=0)//栈不为空,出栈 访问右孩子
{
p=stack[top--];
p=p->rchild;
}
}
return 1;
}
int main()
{
BiTree T;
int m;
m=CreatTree(T);
printf("m=%d\n",m);//m=1说明创建二叉链表成功
PreOrder(T);
}
中序遍历和后序遍历同理,只需要改变其中三个代码的顺序即可。
输入方式及结果: