1、 / B C / / D E F G 六、 分析与探讨1.用按先序遍历输入的方法输入的字符画出二叉树,看图依次按先序、中序、后序的方法写出遍历后的序列与测试结果对比可知正确。2.我在本实验中都是按递归的方法实现遍历,用栈操作也实现了非递归的遍历。七、 附录:源代码 #include#include/ 函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2 /因为在math.h中已定义OVERFLOW的值为3,故去掉此行#define STAC
2、K_INIT_SIZE 100 /存储空间初始分配量#define STACKINCREMENT 10 / 存储空间分配增量typedef int Status; / Status是函数的类型,其值是函数结果状态代码,如OK等typedef int Boolean; / Boolean是布尔类型,其值是TRUE或FALSE/二叉树结点typedef struct BiTNode /数据 char data; /左右孩子指针 struct BiTNode *lchild,*rchild;BiTNode,*BiTree;typedef struct SqStack BiTree *base; /
3、在栈构造之前和销毁之后,base的值为NULL BiTree *top; / 栈顶指针 */ int stacksize; / 当前已分配的存储空间,以元素为单位SqStack; / 顺序栈/按先序序列创建二叉树int CreateBiTree(BiTree &T) /按先序次序输入二叉树中结点的值(一个字符),#表示空树 scanf(%c,&data); if(data = #) T = NULL; else T = (BiTree)malloc(sizeof(BiTNode); /生成根结点 T-data = data; /构造左子树 CreateBiTree(T-lchild); /构造
4、右子树rchild); return 0;/输出void Visit(BiTree T) if(T-data != printf(%c ,T-/先序遍历void PreOrder(BiTree T) if(T != NULL) /访问根节点 Visit(T); /访问左子结点 PreOrder(T- /访问右子结点/中序遍历 void InOrder(BiTree T) = NULL) /访问左子结点 InOrder(T- /访问根节点 Visit(T); /访问右子结点 /后序遍历void PostOrder(BiTree T) PostOrder(T-/栈的基本操作Status InitS
5、tack(SqStack &S) / 构造一个空栈S S.base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree); if(!S.base) exit(-2); /* 存储分配失败 */ S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK;Status StackEmpty(SqStack S) /* 若栈S为空栈,则返回TRUE,否则返回FALSE */ if(S.top=S.base) return TRUE; else return FALSE;Status GetTop(SqStack
6、 S,BiTree &e) /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */ if(S.top e=*(S.top-1); return OK; return ERROR;Status Push(SqStack &S,BiTree e) /* 插入元素e为新的栈顶元素 */ if(S.top-S.base=S.stacksize) /* 栈满,追加存储空间 */ S.base=(BiTree *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTree); if(! exit(-2); S.top=S.bas
7、e+S.stacksize; S.stacksize+=STACKINCREMENT; *S.top+=e;Status Pop(SqStack &S,BiTree & /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK; e=*-S.top;/* 先序遍历(非递归) 思路:访问T-data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。*/void PreOrder2(BiTree T) /p是遍历指针 BiTree p = T; SqStack S; InitStack(S); /栈不空或者p不空时循环 while(p | !StackE
8、mpty(S) if(p ! /存入栈中 Push(S,p); /访问根节点 printf(,p- /遍历左子树 p = p-lchild; else /退栈 Pop(S,p); /访问右子树rchild; /while/* 中序遍历(非递归)T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。 先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T-data,再中序遍历T的右子树。void InOrder2(BiTree T) /退栈,访问根节点/*/后序遍历(非递归)typedef struct BiTNodePost BiTree biTree;
9、char tag;BiTNodePost,*BiTreePost;void PostOrder2(BiTree T) stack stack; BiTreePost BT; while(p != NULL | !stack.empty() /遍历左子树 while(p ! BT = (BiTreePost)malloc(sizeof(BiTNodePost); BT-biTree = p; /访问过左子树tag = L; stack.push(BT); /左右子树访问完毕访问根节点 while(!stack.empty() & (stack.top()-tag = R BT = stack.top(); stack.pop();,BT-biTree- /遍历右子树 /访问过右子树 p = BT-biTree;/层次遍历void LevelOrder(BiTree T) /队列 queue queue; /根节点入队 queue.push(p); /队列不空循环 while(!queue.empty() /对头元素出队 p = queue.front(); /访问p指向的结点 /退出队列 queue.pop(); /左子树不空,将左子树入队 if(p-lchild ! queue.push(p-lc
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1