先历序遍思路: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); //访问根节点 } }