// 二叉树的存储结构
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) {
InOrderTraversal(BT->Left);
InOrderTraversal(BT->Right);
printf("%d", BT->Data);
}
}
// 中序遍历的非递归算法 (左根右)
// 遇到一个结点, 就把它压栈, 并去遍历它的左子树
// 当左子树遍历结束后, 从栈顶弹出这个节点并访问它
// 然后按其右指针再去遍历该节点的右子树
void InOrderTraversal(BinTree BT)
{
BinTree T = BT;
Stack S = CreateStack(MaxSize); // 创建并初始化堆栈S
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;
}
}
}
// 层序遍历
/* 队列实现: 遍历从根节点开始, 首先将根节点入队, 然后
开始执行循环: 结点出队, 访问该节点, 其左右儿子入队 */
/*
1. 从队列中取出一个元素
2. 访问该节点所指结点
3. 若该元素所指结点的左右孩子结点非空, 则
将其左右孩子的指针顺序入队
*/
void LevelOrderTraversal(BinTree BT)
{
Queue Q;
BinTree T;
if(!BT) return ; // 若是空树则直接返回
Q = CreateQueue(MaxSize); // 创建并初始化队列Q
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);
}
}