/*层次遍历,其实就是一个队列,先把根节点压入,之后进入循环,每次先弹出一个根节点,在输出值后,将其左右子树分别压入队列*/
void InorderTraversal(BinTree BT) {
BinTree T;
Stack S = CreateStack(100);//创建并初始化堆栈
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;
Stack S = CreateStack(100);//创建并初始化堆栈
while (T || !IsEmpty(S)) {
while (T) {//一直向左并将沿途结点压入堆栈
printf(" %c", T->Data);
Push(S, T);
T = T->Left;
}
if (!IsEmpty(S)) {
T = Pop(S);
T = T->Right;
}
}
}
//这个其实举一个例子,就很清楚过程了
//因为堆栈后进先出,那根节点先压入,再右子树压入,最后左子树即可
//这样输出顺序就是 左 右 根
void PostorderTraversal(BinTree BT) {
BinTree T;
Stack S = CreateStack(100);
Stack Q = CreateStack(100);//后序遍历 路径存储
while (T || !IsEmpty(S)) {
while (T) {
Push(S, T);
Push(Q, T);
T = T->Right;
}
if (!IsEmpty(S)) {
T = Pop(S);
T = T->Left;
}
}
while (!IsEmpty(Q)) {//输出的就是后序遍历结果
T = Pop(Q);
printf(" %c", T->Data);
}
}