对二叉树的遍历进行实现的算法:
(1)定义二叉树的二叉链表存储结构。
(2)编写建立一棵二叉树算法。
(3)编写中序遍历二叉树算法。
(4)编写后序遍历二叉树算法。
(5)编写算法主程序。
(6)调试运行,记录结果。
编写头文件 Bitree.h
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define OK 1 #define OVERFLOW -2 #define INFEASIBLE -1 #define TRUE 1 #define FALSE 0 #define ERROR 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef char TElemType; typedef int Status; //二叉树的二叉链表存储表示 typedef struct BiTNode { TElemType data; struct BiTNode * lchild,* rchild; } BiTNode,* BiTree; //创建二叉树 Status CreatBiTree(BiTree &T){ char ch; scanf("%c",&ch); if (ch == '#') T=NULL; else { if (!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data=ch; CreatBiTree(T->lchild); CreatBiTree(T->rchild); } return OK; } typedef BiTree SElemType; //栈的顺序存储表示 typedef struct SqStack{ SElemType * base; SElemType * top; int StackSize; }SqStack; Status InitStack(SqStack &S){ S.base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType)); if(!S.base) exit (OVERFLOW); //存储分配失败 S.top=S.base; S.StackSize=STACK_INIT_SIZE; return OK; } //InitStack Status GetTop(SqStack S,SElemType &e){ //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR if (S.top==S.base) return ERROR; e= *(S.top-1); return OK; }//GetTop Status Push(SqStack &S,SElemType &e){ //插入元素e为新的栈顶元素 if (S.top-S.base>=S.StackSize) {//栈满,追加存储空间 S.base=(SElemType *) realloc(S.base, (S.StackSize+STACKINCREMENT)*sizeof(SElemType)); if (! S.base)exit(OVERFLOW);//存储分配失败 S.top=S.base+S.StackSize; S.StackSize+=STACKINCREMENT; } *S.top++=e; return OK; }//Push Status Pop(SqStack &S,SElemType &e){ //若栈不空,则删除S的栈顶元素, //用 e返回其值,并返回OK;否则返回ERROR if(S.top==S.base) return ERROR; e=*--S.top; return OK; }//Pop //若栈为空栈,则返回true,否则返回false Status StackEmpty(SqStack &S){ if (S.top == S.base) return TRUE; else return FALSE; } //中序遍历二叉树 Status InOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){ SqStack S; BiTree p; InitStack(S); Push(S,T); while (!StackEmpty(S)){ while (GetTop(S,p) && p) Push(S,p->lchild); Pop(S,p); if (!StackEmpty(S)) { Pop(S,p); if (!Visit (p->data)) return ERROR; Push(S,p->rchild); } } return OK; }//InOrderTraverse //后序遍历二叉树 Status PostOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){ if (T) { if (PostOrderTraverse(T->lchild,Visit)) if(PostOrderTraverse(T->rchild,Visit)) if(Visit(T->data)) return OK; return ERROR; }else return OK; }//PostOrderTraverse //调用Visit函数 Status PrintElement (TElemType e){ printf("%c",e); return OK; }
实现的主函数:test.c
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include "Bitree.h" void main(){ BiTree T; printf("输入二叉树中结点的值:\n"); CreatBiTree(T); printf("中序遍历二叉树:\n"); InOrderTraverse(T,PrintElement); printf("\n"); printf("后序遍历二叉树:\n"); PostOrderTraverse(T,PrintElement); printf("\n"); }
课堂所学,留纪!
文章来源: https://blog.csdn.net/weixin_43911280/article/details/91354895