最重要的是后序遍历的实现
void InorderTraversal( BinTree BT )//中序
{
BinTree T = BT;
Stack S = CreateStack();//创建堆栈
while (T || !IsEmpty(S))//当树不空或者堆栈不空时
{
while (T)//一直访问左子树
{
Push(S,T);//入栈
T = T->Left;
}
if (!IsEmpty(S))//左子树遍历完后
{
T = Pop(S);//出栈
printf(" %c",T->Data);//访问数据
T = T->Right;//转为访问右子树
}
}
}
void PreorderTraversal( BinTree BT )//先序
{
BinTree T = BT;
Stack S = CreateStack();//创建堆栈
while (T || !IsEmpty(S))//当树不空或者堆栈不空时
{
while (T)//一直访问左子树
{
Push(S,T);//入栈
printf(" %c",T->Data);//访问数据
T = T->Left;
}
if (!IsEmpty(S))//左子树遍历完后
{
T = Pop(S);//出栈
T = T->Right;//转为访问右子树
}
}
}
void PostorderTraversal( BinTree BT )//后序
{
/*左 右 根*/
BinTree T = BT;
Stack S = CreateStack();//创建堆栈
while (T || !IsEmpty(S))//当树不空或者堆栈不空时
{
while (T)//一直访问左子树
{
Push(S,T);//入栈
T->flag = 1;//第一次入栈
T = T->Left;
}
if (!IsEmpty(S))//左子树遍历完后
{
T = Pop(S);//出栈
if(T->flag == 1)//如果第一次入栈,右节点入栈
{
Push(S,T);//入栈
T->flag = 2;//意味两次入栈
T = T->Right;//转为访问右子树
}
else
{
printf(" %c",T->Data);//访问数据
T = NULL;
}
}
}
}