先历序遍思路:1.访问根节点;2.访问当前节点的左子树;3.若当前节点无左子树,则访问当前节点的右子树;即考察到一个节点后,即刻输出该节点的值,并继续遍历其左右子树。(根左右)
中历序遍思路:1.访问当前节点的左子树;2.访问根节点;3.访问当前节点的右子树。即考察到一个节点后,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子树。(左根右)
后序遍历:1.访问左子树;2.访问右子树;3.完成该节点的左右子树的访问后,再访问根节点。即考察到一个节点后,将其暂存,遍历完左右子树后,再输出该节点的值。(左右根)
在遍历之前应先创建一棵树。采用递归的思想来创建,具体实现
0)定义结构体

typedef struct bi_tnode
{
    char data;
    struct bi_tnode *lchild,*rchild;
}bitree_node, *bitree;

1)创建

bitree create_bitree(void)
{
    char ch;
    bitree T;
    if(ch=='#')
        return NULL;
    if(T=(bitree)malloc(sizeof(bitree_node)))==NULL)
    {
        printf("malloc failed\n");
        return NULL;
    }
    T->data=ch;
    T->lchild=create_bitree();
    T->rchild=create_bitree(); 

    return T;      
}

2)前序遍历

void pre_order(bitree T)
{    
    if(T !=NULL){
        printf("%c",T->data);  //访问根节点
        pre_order(T->lchild);  //遍历左子树
        pre_order(T->rchild);  //再遍历右子树
    }
}

3)中序遍历

void in_order(bitree T)
{    
    if(T !=NULL){
        in_order(T->lchild);  //遍历左子树
        printf("%c",T->data);  //访问根节点
        in_order(T->rchild);  //再遍历右子树
    }
}

4)后序遍历

void end_order(bitree T)
{    
    if(T !=NULL){
        end_order(T->lchild);  //遍历左子树
        end_order(T->rchild);  //再遍历右子树
        printf("%c",T->data);  //访问根节点
    }
}