前序遍历的规则:
(1)访问根节点
(2)前序遍历左子树
(3)前序遍历右子树
中序遍历的规则:
(1)中序遍历左子树
(2)访问根节点
(3)中序遍历右子树
后序遍历二叉树的规则:
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根节点
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define N 10
typedef struct node{
int data;
struct node* left;
struct node* right;
} BTnode;
BTnode* creatbtree(int a[],int n)
{
BTnode *p,*pa,*c,*root;
//创建根节点
root=(BTnode*)malloc(sizeof(BTnode));
root->data=a[0];
root->left=root->right=NULL;
for(int i=1;i<n;i++){
p=(BTnode*)malloc(sizeof(BTnode));
p->data=a[i];
p->left=p->right=NULL;
c=root;
while(c){
pa=c;
if(c->data>p->data)
c=c->left;
else
c=c->right;
}
if(pa->data>p->data)
pa->left=p;
else
pa->right=p;
}
return root;
}
//非递归前序遍历二叉树
void PreOrder(BTnode* root){
BTnode**s,*pa;
int top=-1;
s=(BTnode**)malloc((N+1)*sizeof(BTnode*));
//先将根节点入栈
s[++top]=root;
while(top!=-1){
pa=s[top--]; //栈顶出栈
printf("%5d",pa->data);
if(pa->right){ //由于栈是先进后出,所以让右节点先入栈方可使右节点最后出栈输出
s[++top]=pa->right;
}
if(pa->left){ //右节点入栈之后,再对左节点进行入栈
s[++top]=pa->left;
}
}
free(s);
}
//非递归中序遍历二叉树
void InOrder(BTnode* root){
BTnode**s,*pa,*p;
int top=-1;
s=(BTnode**)malloc((N+1)*sizeof(BTnode*));
pa=root;
while(pa||top!=-1){
while(pa){
s[++top]=pa;
pa=pa->left;
}
p=s[top--];
printf("%5d",p->data);
pa=p->right;
}
}
//非递归后序遍历二叉树
void PostOrder(BTnode* root){
BTnode**s,*pa,*p,*last=NULL;
int top=-1;
s=(BTnode**)malloc((N+1)*sizeof(BTnode*));
pa=root;
while(pa||top!=-1){
while(pa){
s[++top]=pa;
pa=pa->left;
}
p=s[top];
if(p->right==NULL||p->right==last){
last=s[top--];
printf("%5d",last->data);
}else{
pa=p->right;
}
}
}
int main (void)
{
int a[N]={3,2,5,8,4,7,6,9,0,1};
BTnode *root;
root=creatbtree(a,N);
//非递归前序遍历 二叉树
printf("该二叉搜索树前序遍历为:");
PreOrder(root);
printf("\n");
//递归中序遍历二叉树
printf("该二叉搜索树中序遍历为:");
InOrder(root);
printf("\n");
//递归后序遍历二叉树
printf("该二叉搜索树后序遍历为:");
PostOrder(root);
}
运行结果: