中序遍历:左-根-右
-
思路分析:
中序遍历的非递归和前序遍历的非递归很相似,只是前序遍历是根-左-右,而中序遍历左-根-右,也就是说,中序遍历是:先遇到根节点不访问,而是直接压入栈,当左路节点为空时,取出左路节点,并访问左路节点的右子树。
-
具体分为以下几个步骤:
①若根的左子树不为空,则将其入栈,并将它的左子树当成当前根,然后再对当前根进行相同的处理;
②若当前根的左子树为空,则取出该节点,而后将的右子树置为当前节点,看其是否为空;
③若不为空,则重复以上两个操作;
④若为空,则让该节点出栈,并取出栈顶节点,并将出栈的节点的右子树置为当前节点,看其是否为空,重复③和④操作;直到当前节点为NULL且栈为空时,遍历结束。
-
具体实现代码如下:
void BinaryTreeInOrderNonR(BTNode* root)//中序遍历的非递归
{
Stack st;
StackInit(&st, 10);
BTNode* cur = root;
//1.压左路节点
while (cur || StackEmpty(&st) != 0)
{
while (cur)
{
StackPush(&st, cur);
cur = cur->_left;
}
//2.取出左路节点,并访问左路节点的右子树
BTNode* top = StackTop(&st);
printf("%c ", top->_data);
StackPop(&st);
cur = top->_right;
}
printf("\n");
}