算法
左子树为空或者左子树已经访问完毕后,再访问根 访问根完毕后 再访问右子树
栈结构 符合先入后出
步骤一:结点有左子树 结点入栈;结点没有左子树 访问该结点
步骤二:结点有右子树 重复步骤一;结点没有右子树 结点访问完毕 根据栈顶指示回退 访问栈顶元素 并 访问右子树
重复步骤一
栈为空则遍历结束
结点入栈表明 本身没被访问 自身的右子树也没有被访问
代码
typedef struct BiTNode* BiTree;
void inOrder(BiTNode * root)
{
if(root == NULL)
{
return ;
}
//遍历左子树
inOrder(root->lchild);
//遍历右子树
inOrder(root->rchild);
}
BiTNode * goLeft(BiTNode * T,stack<BiTNode*> &s)
{
if(T = NULL)
{
return NULL;
}
while(T->lchild !=NULL)
{
s.push(T);
T = T->lchild;
}
return T;
}
void Inorder2(BiTnode *T)
{
BiTNode t=NULL;
stack<BiTnode *> s;
t = goLeft(T,s);
while(t)
{
cout<<t->data;
if(t->rchild !=NULL)
{
t = goLeft(t->rchild,s);//右子树中序遍历起点
}
else if(!s.empty())
{
t = s.top();
s.pop();
}
else //没有右子树 栈为空
{
t= NULL;
}
}
}
void main()
{
BiTNode t1,t2,t3,t4,t5;
memset(&t1,0,sizeof(BiTNode);
memset(&t2,0,sizeof(BiTNode);
memset(&t3,0,sizeof(BiTNode);
memset(&t4,0,sizeof(BiTNode);
memset(&t5,0,sizeof(BiTNode);
t1.lchild = &t2;
t1.rchild = &t3;
t2.lchild = &t4;
t3.lchild = &t5;
inOrder(&t1);
inOrder2(&t1);
system("pause");
return ;
}