中序遍历:
实现过程:
首先我们知道中序遍历就是先访问左子树,再根节点,最后右子树。
STL的stack容器满足我们的先进后出的要求。
1.访问根节点的左孩子节点,看是否为NULL, 如果存在左节点,该节点入栈如果没有左子树,那就访问该节点。
2.如果节点有右子树,则重复1步骤,如果没有右子树(节点访问完毕),回退,让栈顶元素弹出。访问栈顶元素,并访问右子树,重复步骤1
3.如果栈为空,表示遍历结束
注意:入栈的节点表示,本身没有被访问过,同时右子树也没被访问过
有一个一直往左走的入栈操作
#include<iostream>
#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;
}
while(T->lchild)
{
s.push(T);
T=T->lchild;
}
return T;
}
void InOrder2(BiNode *T)
{
//一直往左走,找到中序遍历的起点
BiTree t=GoFarLeft(T,s);
while(t)
{
printf("%d",t->data);//中序遍历打印
if(t->rchild!=NULL)
{
t=GoFarLeft(t->rchild,s)
}
else if(!s.empty())
{
t=s.top();
s.pop();
}
else
{
t=NULL;
}
}
}