二叉树的遍历实现方式有两种:递归和非递归。
1.使用递归的方式实现二叉树的遍历。
(1)先序遍历:
首先访问一个二叉树的根节点,然后按顺序分别访问根节点的左子树和右子树:
void Pre1(BTNode* b)
{if(b!=NULL)
{printf("%d",b->data);
Pre1(b->Lchild);
Pre1(b->Rchild);
}
(2)中序遍历:
首先访问左子树,再访问根节点,最后访问右子树;
void mid1(BTNode* b)
{if(b!=NULL)
{mid1(b->Lchild);
printf("%d",b->data);
mid1(b->Rchild);
}
(3)后序遍历:
首先访问左子树,再访问右子树,最后访问根节点;
void rear1(BTNode* b)
{if(b!=NULL)
{rear1(b->Lchild);
rear1(b->Rchild);
printf("%d",b->data);
}
2.第二种实现的方式是使用非递归的方式:
(1)先序遍历:
void Pre2(BTNode* b)
{BTNode* p,* BT[max];
int top=-1;
if(b!=NULL)
{top++;
BT[top]=b;
while(top!=-1)
{p=BT[top];
top--;
printf("%d",p->data);
if(p->Rchild!=NULL)
{top++;
BT[top]=p->Rchild;
}
if(p->Lchild!=NULL)
{top++;
BT[top]=p->Lchild;
}
}
printf("\n")
}
}
(2)中序遍历:
void mid2(BTNode* b)
{BTNode* p,*BT[max];
int top=-1;
if(b!=NULL)
{p=b;
while(top!=-1||p!=NULL)
{p=BT[top];
while(p!=NULL)
{top++;
BT[top]=p;
p->Lchild;
}
if(top!=-1)
{p=BT[top];
top--;
printf(“%d”,p->data);
p=p->Rchild;
}
}
printf("\n");
}
}
(3)后序遍历:
void rear2(BTNode* b)
{BTNode * p,*BT[max];
int flag,top=-1;
if(b!=NULL)
{do
{while(b!=NULL)
{top++;
ST[top]=b;
b=b->Lchild;
}
p=NULL;
flag=1;
while(top!=-1&&flag)
{
b=ST[top];
if(b->Rchild==p)
{
printf("%d",b->data);
top--;
p=b;
}
else
{ b=b->Rchild;
flag=0;
}
}
}while(top!=-1);
printf("\n");
}
}