#include "function.h"
//递归实现
//abdhiejcfg前序遍历,前序遍历就是深度优先遍历
void PreOrder(BiTree p){
if(p!=NULL){
putchar(p->c);
PreOrder(p->lchild); //递归打印左子树
PreOrder(p->rchild); //递归打印右子树
}
}
//中序遍历
void InOrder(BiTree p){
if(p!=NULL){
InOrder(p->lchild); //递归打印左子树
putchar(p->c);
InOrder(p->rchild); //递归打印右子树
}
}
//后序遍历
void PostOrder(BiTree p){
if(p!=NULL){
PostOrder(p->lchild); //递归打印左子树
PostOrder(p->rchild); //递归打印右子树
putchar(p->c);
}
}
int main(){
BiTree pnew;//用来指向新申请的树结点
BiTree tree = NULL; //tree是指向树根的,代表树
char c;
ptag_t phead = NULL,ptail = NULL,listpnew = NULL,pcur;
//abcdefj
while(scanf("%c",&c)){
if(c=='\n'){
break; //读取到换行就结束
}
//calloc申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0
pnew = (BiTree)calloc(1,sizeof(BiTNode));
pnew -> c = c;
listpnew = (ptag_t)calloc(1,sizeof(tag_t)); //给队列结点申请空间
listpnew -> p = pnew;
//如果是树的第一个结点
if(NULL == tree){
tree = pnew; // tree指向树的根结点
phead = listpnew; //第一个结点既是队列头,又是队列尾巴
ptail = listpnew;
pcur = listpnew; // pcur要指向要进入树的父亲元素
}
else{
//让b元素入队列
ptail ->pnext = listpnew;
ptail = listpnew;
//接下来把b结点放入树中
if(NULL == pcur ->p ->lchild){
pcur ->p ->lchild = pnew; //左孩子为空,就放入左孩子
}
else if(NULL == pcur ->p ->rchild){
pcur ->p ->rchild = pnew; //右孩子为空放入右孩子
pcur = pcur ->pnext;//当前结点左右孩子都有,pcur就指向下一个
}
}
}
printf("------PreOrder------\n"); //也叫先序遍历,先打印当前结点,打印左孩子,打印右边=孩子
PreOrder(tree);
printf("\n------PreOrder------\n"); //先打印左孩子,打印父亲,打印右孩子
InOrder(tree);
printf("\n------PostOrder------\n"); //先打印左孩子,打印父亲,打印右孩子
PostOrder(tree);
return 0;
}
#ifndef FUNCTION_H_INCLUDED
#define FUNCTION_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
typedef char BiElemType;
typedef struct BiTNode{
BiElemType c;//c 就是书籍上的 data
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
//tag 结构体是辅助队列使用的
typedef struct tag{
BiTree p;//树的某一个结点的地址值
struct tag *pnext;
}tag_t,*ptag_t;
#endif // FUNCTION_H_INCLUDED