//感谢MOOC里的大神,选了一种最为方便的写法
//另外还可以在树结构中增加一个记录访问次数的选项
//那个更容易理解,但是麻烦,也贴在后面
typedef struct TREE
{
int data;
int visit; //用来记录节点的访问次数
struct TREE * left;
struct TREE * right;
}*BinTree , Tnode;
void postra1111(BinTree BT)
{
BinTree pre = NULL ; //增加一个记录上一个节点
BinTree T = BT;
Stack S = create_stack(MAXSIZE);
while ( T || !Is_empty(S) )
{
while (T)
{
push(S, T);
T = T->left;
}
T = pop(S);
if(T->right==NULL || pre == T->right)
{
printf("%3c", T->data);
pre = T;
T = NULL;//这一步很关键;
//没有这一步就无限循环了
}
else
{
//如果右儿子不为空,且没有访问过右儿子
push(S, T);
T = T->right;
}
}
return ;
}
void posttraversal(BinTree T)
{
BinTree work = T;
Stack S = create_stack(MAXSIZE);
while (work || !Is_empty(S))
{
while (work)
{
if (work->visit == 0)
{
(work->visit)++;
push(S, work);
}
work = work->left;
}
if (!Is_empty(S))
{
work = pop(S);
if ( (work->visit) == 2)
{
printf("%3c",work->data);
work=NULL;
}
else
{
(work->visit)++;
push(S, work);
work = work->right;
}
}
}
return ;
}
/*
*
*
*/
//二叉数的层次遍历,借助循环队列
//注意循环队列的插入删除的方式
//下次研究一下借助堆栈如何实现
void leveltraversal(BinTree BT)
{
Queue Q = crea_queue(MAXSIZE);
BinTree T;
if (!BT)
{
return;
}
AddQ(Q, BT);
while (!is_empty(Q))
{
T = deleteQ(Q);
printf("%3c",T->data);
if (T->left)
{
AddQ(Q, T->left);
}
if (T->right)
{
AddQ(Q, BT->right);
}
}
}