步骤1:结点的所有路径情况
如果结点有左子树,该结点入栈;
如果结点没有左子树,访问该结点;
步骤2:路径所有情况
如果结点有右子树,重复步骤1;
如果结点没有右子树(结点访问完毕),回退,让栈顶元素出栈,访问栈顶元素,并访问右子树,重复步骤1
如果栈为空,表示遍历结束。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stack>
using namespace std;
typedef struct BiNode
{
int data;
struct BiNode *lchild, *rchild;
}BiNode, *BiTree;
BiNode *GoFarLeft(BiNode *T, stack<BiNode*>&s)
{
if (T == NULL)
{
return NULL;
}
//一直向左找,找到T的中序遍历起点
while (T->lchild)
{
s.push(T);
T = T->lchild;
}
}
void InOrder2(BiNode *T)
{
stack<BiNode*>s;
BiNode *t = GoFarLeft(T,s);//步骤1:获得中序遍历起点
while (t)
{
printf("%d ", t->data);
//如果存在右子树,重复步骤1
if (t->rchild)
{
t = GoFarLeft(t->rchild, s);
}
//如果t没有右子树且栈不为空,弹出栈顶元素
else if (!s.empty())
{
t = s.top();
s.pop();
}
//如果t没有右子树且栈为空,表示遍历结束
else
{
t = NULL;
}
}
}
void main()
{
int num = 0;
BiTree p1, p2, p3, p4, p5;
p1 = (BiTree)malloc(sizeof(BiNode));
p2 = (BiTree)malloc(sizeof(BiNode));
p3 = (BiTree)malloc(sizeof(BiNode));
p4 = (BiTree)malloc(sizeof(BiNode));
p5 = (BiTree)malloc(sizeof(BiNode));
memset(p1, 0, sizeof(BiNode));
memset(p2, 0, sizeof(BiNode));
memset(p3, 0, sizeof(BiNode));
memset(p4, 0, sizeof(BiNode));
memset(p5, 0, sizeof(BiNode));
p1->data = 1;
p2->data = 2;
p3->data = 3;
p4->data = 4;
p5->data = 5;
p1->lchild = p2;
p1->rchild = p3;
p2->lchild = p4;
p3->lchild = p5;
InOrder2(p1);
}