树的递归遍历真的超级简单..........
前中后序无非是看打印语句(printf)的位置了,
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode { //树的节点
ElementType Data; //数据域
BinTree Left; //左孩子
BinTree Right; //右孩子
};
//File *fp=fopen("path","r"); 也可以用文件读取序列化的树
//char e = fgetc(fp);
BinTree CreateBitree(BinTree T) { //先序创建一颗二叉树
char e;
scanf("%c", &e);
if (e != '#') { //判断当前输入的字符
T = (BinTree)malloc(sizeof(BinTree)); //分配存贮空间
T->Data = e;
T->Left = NULL;
T->Right = NULL;
T->Left = CreateBitree(T->Left); //递归创建左孩子节点值
T->Right = CreateBitree(T->Right); //递归创建右孩子节点值
}
return T;
}
/*
用递归写二叉树遍历......
printf 在前就是前序,在中就是中序,在后就是后续
*/
void InorderTraversal( BinTree BT ) { //中序遍历
if(BT==NULL)return ;
InorderTraversal(BT->Left);
printf(" %c",BT->Data); //因为这个在中间,下面的同理
InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ) { //先序遍历
if(BT==NULL)return ;
printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ) { //后序遍历
if(BT==NULL)return ;
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
//这个是层级遍历
void LevelorderTraversal( BinTree BT ) {
if (BT == NULL)
return;
BinTree binTree[100]; //数组迭代存储层序遍历的节点
int head = 0, last = 0; //
binTree[last++] = BT;
while (head < last) { //通过迭代存储和遍历节点
BinTree temp = binTree[head++];
printf(" %c", temp->Data);
if (temp->Left) //左子树存在
binTree[last++] = temp->Left;
if (temp->Right) //右子树存在
binTree[last++] = temp->Right;
}
}
int main() {
BinTree BT = NULL;
BT = CreateBitree(BT);
printf("中序:");
InorderTraversal(BT);
printf("\n");
printf("先序:");
PreorderTraversal(BT);
printf("\n");
printf("后序:");
PostorderTraversal(BT);
printf("\n");
printf("层级:");
LevelorderTraversal(BT);
printf("\n");
return 0;
}