四种遍历方法
(总记得写过,但是没找到,原来在草稿箱里面,还是发出来吧)
中序遍历
void InorderTraversal(BinTree BT)
{
if (BT)
{
InorderTraversal(BT->Left);
printf(" %c", BT->Data);
InorderTraversal(BT->Right);
}
}
先序遍历
递归写法:
void PreorderTraversal(BinTree BT)
{
if (BT)
{
printf(" %c", BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
}
非递归写法:
void PreorderPrintLeaves(BinTree BT)
{
BinTree T = BT;
while (T || !IsEmpty(S)) {
while (T) {
Push(S, T);
printf("%5d", T->Data);
T = T->Left;
}
if (!IsEmpty(S)) {
T = Pop(S);
T = T->Right;
}
}
}
后序遍历
void PostorderTraversal(BinTree BT)
{
if (BT)
{
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c", BT->Data);
}
}
层序遍历
struct queue {
BinTree Data;
struct queue* Next;
};
void Pop(BinTree data);//入队
BinTree Push();//出队
struct queue* head, * tail;
void LevelorderTraversal(BinTree BT)
{
if (!BT) return;//空树直接返回
head = tail = NULL;
Pop(BT);
while (tail != NULL&&head!=NULL) {
BinTree T= Push();
if(T)printf(" %c", T->Data);
if (T->Left) Pop(T->Left);
if (T->Right) Pop(T->Right);
}
}
//入队
//简单队列
void Pop(BinTree data)
{
struct queue* temp = (struct queue*)malloc(sizeof(struct queue));
temp->Data = data;
temp->Next = NULL;
if (head == NULL) head = temp;
else tail->Next = temp;
tail = temp;
}
//出队
BinTree Push() {
BinTree point = head->Data;
head = head->Next;
return point;
}