文章目录
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
void CreatBinTree(BinTree &T); /* 实现细节忽略 */
void InorderTraversal(BinTree BT);
void PreorderTraversal(BinTree BT);
void PostorderTraversal(BinTree BT);
void LevelorderTraversal(BinTree BT);
int main()
{
BinTree BT;
CreatBinTree(BT);
printf("Inorder:"); InorderTraversal(BT); printf("\n");
printf("Preorder:"); PreorderTraversal(BT); printf("\n");
printf("Postorder:"); PostorderTraversal(BT); printf("\n");
printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
system("PAUSE");
return 0;
}
/* 你的代码将被嵌在这里 */
void CreatBinTree(BinTree &T){
ElementType ch;
scanf("%c", &ch);
getchar();
if (ch == '#')T = NULL;//空树,递归结束
else{
T = (BinTree)malloc(sizeof(struct TNode));
T->Data = ch;
CreatBinTree(T->Left);
CreatBinTree(T->Right);
}
return;
}
void InorderTraversal(BinTree BT){//左根右
if (BT != NULL){
InorderTraversal(BT->Left);
printf(" %c", BT->Data);
InorderTraversal(BT->Right);
}
return;
}
void PreorderTraversal(BinTree BT)//根左右
{
if (BT != NULL){
printf(" %c", BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
return;
}
void PostorderTraversal(BinTree BT)//左右根
{
if (BT != NULL){
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c", BT->Data);
}
return;
}
//层次遍历利用了(顺序结构,因为用数组即可较为简单)队列存数
//队列先进先出的原理:1先进根;2出根,进左右孩子,此时头指针应为左孩子/(若无左孩子)右孩子)3若有左孩子也有右孩子,左孩子出队后的头指针为右孩子,所以循环步骤2就达到了层次遍历的效果
void LevelorderTraversal(BinTree BT)
{
if (BT == NULL)return;
BinTree Queue[1000];//队列Queue存储BinTree类型的指针地址(数组做队列即顺序结构队列)
int front = 0,rear=0;
//尾下标队伍元素入队,尾下标移位
Queue[rear++] = BT;//根节点入队让队伍中有元素
while (front<rear){//当队列中有元素时
//队列先进先出
//层次遍历就是:进根,让队伍中有元素;
//出根并访问(输出),进左右;第二次循环头下标即左(若无左,则也没进左,头下标即右),左为根循环之前的操作
//设置这一次的头下标为根,头下标移位
BinTree bt = Queue[front++];
//根出队并输出
printf(" %c", bt->Data );
//如果根有左孩子,左孩子进队
if (bt->Left)
Queue[rear++]=bt->Left;
//如果根有右孩子,右孩子进队
if (bt->Right)
Queue[rear++] = bt->Right;
}
}
0.结构体
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
1.创建二叉树(和我写的总结中的一样)
void CreatBinTree(BinTree &T){
ElementType ch;
scanf("%c", &ch);
getchar();
if (ch == '#')T=NULL;//空树,递归结束
else{
T = (BinTree)malloc(sizeof(struct TNode));
T->Data = ch;
CreatBinTree(T->Left);
CreatBinTree(T->Right);
}
return;
}
主函数
BinTree BT;
CreatBinTree(BT);
2.中序遍历Inorder Traversal:左根右
void InorderTraversal(BinTree BT){//左根右
if (BT != NULL){
InorderTraversal(BT->Left);
printf(" %c", BT->Data);
InorderTraversal(BT->Right);
}
return;
}
3.先序遍历Preorder Traversal:根左右
void PreorderTraversal(BinTree BT)//根左右
{
if (BT != NULL){
printf(" %c", BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
return;
}
4.后序遍历Postorder Traversal:左右根
void PostorderTraversal(BinTree BT)//左右根
{
if (BT != NULL){
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c", BT->Data);
}
return;
}
△5.层次遍历Levelorder Traversal:利用了(顺序结构,因为用数组即可较为简单)队列存数
队列先进先出的原理:
1先进根;
2出根,进左右孩子,此时头指针应为左孩子/(若无左孩子)右孩子)
3若有左孩子也有右孩子,左孩子出队后的头指针为右孩子,所以循环步骤2就达到了层次遍历的效果
参考https://blog.csdn.net/hansionz/article/details/81947834
void LevelorderTraversal(BinTree BT)
{
if (BT == NULL)return;
BinTree Queue[1000];//队列Queue存储BinTree类型的指针地址(数组做队列即顺序结构队列)
int front = 0,rear=0;
//尾下标队伍元素入队,尾下标移位
Queue[rear++] = BT;//根节点入队让队伍中有元素
while (front<rear){//当队列中有元素时
//队列先进先出
//层次遍历就是:进根,让队伍中有元素;
//出根并访问(输出),进左右;第二次循环头下标即左(若无左,则也没进左,头下标即右),左为根循环之前的操作
//设置这一次的头下标为根,头下标移位
BinTree bt = Queue[front++];
//根出队并输出
printf(" %c", bt->Data );
//如果根有左孩子,左孩子进队
if (bt->Left)
Queue[rear++]=bt->Left;
//如果根有右孩子,右孩子进队
if (bt->Right)
Queue[rear++] = bt->Right;
}
}
主函数
printf("Inorder:"); InorderTraversal(BT); printf("\n");
printf("Preorder:"); PreorderTraversal(BT); printf("\n");
printf("Postorder:"); PostorderTraversal(BT); printf("\n");
printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");