二叉树中序遍历非递归详解
1. 首先给出一颗二叉树,如下图所示:
图1 一颗简单的二叉树
根据二叉树的中序遍历的特性,该二叉树中序遍历顺序为:DBGEACHFI;
2. 一般遍历一颗二叉树,先序中序或者后序,大家最喜欢也最熟悉的方法是采用递归的形式来描述,但是在面试或者笔试的过程中,面试官一般都会要求采用非递归形式的二叉树遍历过程。我们先给出二叉树的递归形式(以中遍历为例子),然后给出二叉树的非递归形式。
Void inOrder(BiTree root){
If(root!=NULL){
inOrder(root->left);
cout<<root->data<<”\t”;
inOrder(root->right);
}
}
3. 二叉树中序非递归写法如下,先给出代码,后面会具体给出代码分析:
Void inOrder(BiTree root){
BiTree stack[MaxSize],p=root;//建立一个顺序栈,设置一个临时指针,并将指针p指向根节点;
Int top=1;//设置顺序栈的初始大小为1;
While(top>0||p!=NULL)//循环条件,栈大小不为空或者p非空;
{
If(p!=NULL){//如果遇到非空二叉树,入栈,并沿着当前节点的左链遍历当前节点的左子树;
{
Stack[++top]=p;
P=p->left;
}
else{
//如果遇到空的二叉树,就将当前指针出栈,并打印出出栈指针的值,并沿着当前节点的右链遍历当前节点的右子树;
p=stack[top--];
cout<<p->data<<”\t”;
p=p->right;
}
//循环终止条件时当栈的大小为0或者当前指针p为空!;
}
}
}
4. 对于上面的图,我们可以对它进行追踪其非递归的执行过程: