#include<iostream>
#include<stack>
#define ElementType int
typedef struct TreeNode* BinTree;
typedef BinTree Position;
struct TreeNode
{
ElementType data;
BinTree Left;
BinTree Right;
};
//递归实现先序中序后序遍历
void PreOrderTraversal(BinTree BT)//先序
{
if (BT)
{
printf("%d", BT->data);
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
}
}
void InOrderTraversal(BinTree BT)//中序
{
if (BT)
{
InOrderTraversal(BT->Left);
printf("%d", BT->data);
InOrderTraversal(BT->Right);
}
}
void PostOrderTraversal(BinTree BT)
{
if (BT)
{
PostOrderTraversal(BT->Left);
PostOrderTraversal(BT->Right);
printf("%d", BT->data);
}
}
//中序非递归遍历
void InOrderTraversal(BinTree BT)
{
BinTree T = BT;
Stack S = CreatStack(MaxSize);//创建并初始化堆栈
while (T||!IsEmpty(S))//满足一个退出循环(树不存在了或栈满了)
{
while (T)//一直想左并将沿途节点压入堆栈
Push(S, T);
T = T->Left;
}
if (!IsEmpty(S))
{
T = Pop(S);//节点弹出堆栈
printf("%5d", T->Data);
T = T->Right;//转向右子树
}
}
//层序遍历
void LevelOrderTraversal(BinTree BT)
{
Queue Q;//队列
BinTree T;
if (!BT)//若是孔数直接返回
return;
Q = CreatQueue(MaxSize);//创建并初始化队列
AddQ(Q,BT);//根节点存入队列
while (!IsEmptyQ(Q))//当队列没有空余,循环退出
{
T = DeleteQ(Q);
printf("%d\n", T->data);//访问取出队列的节点
if (T->Left)
AddQ(Q, T->Left);
if (T->Right)
AddQ(Q, T->Right);
}
}
//树的同构