二叉树有三种递归遍历算法:先序、中序和后序三种遍历算法。递归程序虽简洁,但执行效率不高。
下面是二叉树遍历的非递归算法。需要用到栈(特点:后进先出)。
思路:以中序遍历(LDR)为例,先设置一个指针p指向当前需要处理的结点,首先指向根结点,同时设置一个保存指针指向的数据的顺序栈,初态为空栈。开始扫描(并非访问)根结点及其作孩子结点(后面简称左结点),若左结点存在,则将该根结点及其所有左结点入栈,当无左结点时,表示栈顶结点无左孩子,然后栈顶结点出栈,并访问它,接着沿该结点的右子树向下遍历。该过程重复,直到栈空且p为空指针时停止。
算法:
void InOrderNRe(BTNode *b) //一个二叉树b
{
BTNode *St[MaxSize], *p; //建立一个指针和空栈
int top=-1;
p=b; //指针p指向树的根结点
while(top>-1‖p!=NULL) //栈不为空或指针p不为空指针
{
while(p!=NULL) //扫描p指向的所有左结点
{
top++; //入栈
St[top]=p; //p指向的元素入栈
p=p->lchild; //入栈后,指针指向该结点的左结点
}
if(top>-1) //p为空指针,但栈不为空时,则先出栈,再处理右结点
{
p=St[top]; //出栈,p指针指向出栈的元素(根结点),为访问根结点和处理右结点而准备
top--;
visite(p); //访问根结点
p=p->rchild; //处理右结点
}
}
}