www.pudn.com > gc.rar > GC_862.C
# include# include typedef struct node2 { /*标准存储结构*/ char data; struct node2 *lchild; struct node2 *rchild; }TNODE2; //TNODE2 * 可表示根指针的类型 /*函数,建立二叉树*/ void CreateBinTree(TNODE2 **T) { /*构造二叉链表,T是指向根指针的指针,故修改*T就是修改了实参(根指针)本身*/ char ch; if ((ch = getchar()) == ' ') *T = NULL; //读入空格,将相应指针置空 else { //读入非空格 *T = (TNODE2 *)malloc(sizeof(TNODE2)); //生成结点 (*T)->data = ch; CreateBinTree(&(*T)->lchild); //构造左子树 CreateBinTree(&(*T)->rchild); //构造右子树 } } /*函数,前序遍历*/ void re_preorder(TNODE2 *t) { if(t != NULL) { /*非空二叉树*/ printf("%c",t->data); re_preorder(t->lchild); re_preorder(t->rchild); } } /*函数,中序遍历*/ void re_midorder(TNODE2 *t) { if (t != NULL) { /*非空二叉树*/ re_midorder(t->lchild); printf("%c",t->data); re_midorder(t->rchild); } } /*函数,后序遍历*/ void re_posorder(TNODE2 *t) { if (t != NULL) { re_posorder(t->lchild); re_posorder(t->rchild); printf("%c",t->data); } } /*函数,中序遍历(非递归,采用链接栈)*/ typedef struct snode { /*栈元类型*/ TNODE2 * tnodept; /*栈结点为指向二叉树结点的指针*/ struct snode *link; /*栈结点链接指针*/ }SNODE; void st_midorder(TNODE2 *t) { SNODE *top = NULL, /*栈顶指针*/ *p; /*工作变量*/ while(t != NULL || top != NULL) { /*二叉树未访问完,或栈非空*/ while(t!=NULL) { /*一颗二叉树未访问完,循环*/ /*根结点进栈*/ p = (SNODE *)malloc(sizeof(SNODE)); p->tnodept = t; p->link = top; top = p; /*沿着左子树前进,将经过的结点依次进栈*/ t=t->lchild; } if(top != NULL) { /*如栈非空*/ t = top->tnodept; /*栈顶结点出栈*/ p = top; top = top->link; free(p); /*释放栈顶结点的空间*/ printf("%c",t->data); /*访问根结点*/ t=t->rchild; /*向右子树前进*/ } } } void main() { TNODE2 *root=NULL; //二叉树的根 printf("首先建立二叉树\n"); printf("请按照前序输入二叉树,子树为空就输入空格\n"); printf("如以下序列:ABDH(NULL)(NULL)(NULL)EI(NULL)(NULL)(NULL)CF(NULL)(NULL)G(NULL)(NULL)"); printf("就是以下形式,你所输入的对齐就可以了,注意最后还有两个空格:\nABDH EI CF G \n"); CreateBinTree(&root); printf("\n函数,前序遍历\n"); /*函数,前序遍历 */ re_preorder(root); /*函数,中序遍历*/ printf("\n函数,中序遍历\n"); re_midorder(root); /*函数,后序遍历*/ printf("\n函数,后序遍历\n"); re_posorder(root); /*函数,中序遍历(非递归,采用链接栈)*/ printf("\n函数,中序遍历(非递归,采用链接栈)\n"); st_midorder(root); }