中序遍历顾名思义,就是先访问根节点,再访问左右孩子的遍历方法,对于一棵二叉树而言,我们可以采用递归和非递归的方法来实现对二叉树各节点的遍历。递归方法实现简单,但对于空间复杂度要求较高;非递归方法虽然高效,但代码实现困难。
下面是递归实现中序遍历:(空间复杂的为O(n))
//中序遍历
void InOrder(BiTree p)
{
if (NULL != p)
{
InOrder(p->lchild);
putchar(p->data);
InOrder(p->rchild);
}
}
而非递归实现起来如下:
//非递归实现
//中序遍历
void InOrder2(BiTree T)
{
SqStack S;
InitStack(S);//辅助栈初始化
BiTree p = T;
while (p || !StackEmpty(S))
{
if (p)
{
Push(S, p);
p = p->lchild;
}
else
{
Pop(S, p);
putchar(p->data);
p = p->rchild;
}
}
}
需要借助一个辅助栈来存取遍历元素,进行不断的压栈弹栈的操作。