1、河北联合大学二叉树遍历数据结构(双语)项目文档报告用递归、非递归两种方法遍历二叉树专 业: 计算机科学与技术 班 级: 指导教师: 姓 名: 学 号: 目 录一、设计思想.01二、算法流程图.02三、源代码.05四、运行结果.09五、遇到的问题及解决.10六、心得体会.11一、设计思想本报告采用递归、非递归两种方法遍历二叉树1:递归遍历二叉树: 前序遍历:先判断根节点是否为空,如果不为空则输出。再判断根节点的左节点,如果不为空,则递归调用,直到遇到最左边的节点,接着访问最左边节点的右子树,如果不为空,接着递归调用刚才左子树的过程,直到遇到叶子节点。如果右子树为空,则回溯到上次递归调用,重复对右
2、子树进行遍历和输出。 中序遍历:先判断根节点是否为空,如果不为空在判断根节点的左节点,如果不为空,则递归调用,直到遇到最左边的节点,然后输出,接着访问最左边节点的右子树,如果不为空,则重复上述对左子树的操作,直到遍历到叶子节点,如果右子树为空,则回溯到上一次递归调用,从而访问上一次节点的右子树,重复以上操作。 后序遍历:先判断根节点是否为空,如果不为空在判断根节点的左节点,如果不为空,则递归调用,直到遇到最左边的节点,然后访问最左节点的右节点,再接着访问右节点的左子树的最右节点并输出,重复执行上述操作,直到遍历完整个二叉树。2:非递归遍历二叉树 前序遍历:首先建立一个栈用来存放输入的二叉树的数
3、值,当输入的数值不为空时,将数值存入栈中(此节点为根节点),然后访问当前节点的左节点,如果不为空,则将当前节点继续压入到栈中,以此类推,当节点的左节点为空时,栈顶指针减一,继而访问节点的右节点,如果不为空,则将当前节点压入栈中,以此类推,当节点的右节点为空时,栈顶指针减一,在这样的过程中,依次遍历了根节点的左子树和右子树,从而完成了整个二叉树的遍历。 中序遍历:中序遍历和先序遍历差不多,只是当遍历到左节点的时候输出节点的值。 后序遍历:依然定义一个栈,但此时要对每个节点进行两次输入和输出,当第二次输出这个节点的时候,输出这个节点的值,其中定义一个量flag来定义,当flag为1的时候,表示第一
4、次入栈,当flag为2时,表示第二次出栈,此时输出当前节点的值。二、算法流程图图6 非递归算法后序遍历三、源代码下面给出的是用递归和非递归实现前中后遍历二叉树的算法实现的程序的源代码:#include #include #define MAXSIZE 100typedef struct BTree char data; struct BTree * PLeft; struct BTree * PRight;BTree, *PBTree;typedef struct BTreeFlag PBTree btree; int flag;BTreeFlag, * PBTreeFlag;void Cre
5、ateBT(PBTree *b) char ch; scanf(%c, &ch); if(ch = #) *b = NULL; else if(ch=&) return; else *b = (PBTree)malloc(sizeof(BTree); if(!(*b) return; (*b)-data = ch; CreateBT(&(*b)-PLeft); CreateBT(&(*b)-PRight); void PreTraverseBT(PBTree b) if(b) printf(%2c,b-data); PreTraverseBT(b-PLeft); PreTraverseBT(b
6、-PRight); else return; void PreTraverseBT2(PBTree b) PBTree stackMAXSIZE; int top; PBTree p; p = b; top = 0; while(p!=NULL|top0) while(p!=NULL) printf(%2c, p-data); stacktop+ = p; p = p-PLeft; if(top0) p = stack-top; p = p-PRight; void InTraverseBT(PBTree b) if(b) InTraverseBT(b-PLeft); printf(%2c,
7、b-data); InTraverseBT(b-PRight); else return; void InTraverseBT2(PBTree b) PBTree stackMAXSIZE; int top; PBTree p; top = 0; p = b; while(p!=NULL|top0) while(p!=NULL) stacktop+ = p; p = p-PLeft; if(top0) p = stack-top; printf(%2c, p-data); p = p-PRight; void PoTraverseBT(PBTree b) if(b) PoTraverseBT(
8、b-PLeft); PoTraverseBT(b-PRight); printf(%2c, b-data); else return; void PoTraverseBT2(PBTree b) BTreeFlag stackMAXSIZE; int top,sign; PBTree p; top = -1; p = b; while(p!=NULL|top!=-1) /node input stack firstly if(p!=NULL) top+; stacktop.btree = p; p = p-PLeft; stacktop.flag = 1; else p = stacktop.b
9、tree; sign = stacktop.flag; top-; if(1=sign) /node input stack firstly top+; stacktop.btree = p; stacktop.flag = 2; /node output stack secondly p = p-PRight; else printf(%2c, p-data); p = NULL; void InitBTree(PBTree b) b = NULL;void InitBTree(PBTree b);void PreTraverseBT(PBTree b); void PreTraverseB
10、T2(PBTree b);void InTraverseBT(PBTree b);void InTraverseBT2(PBTree b);void PoTraverseBT(PBTree b);void PoTraverseBT(PBTree b);void CreateBT(PBTree *b);void main() PBTree m; InitBTree(m); printf(please input char! n); CreateBT(&m); printf(recursion preorder tarverse is: n); PreTraverseBT(m); printf(n
11、); printf(unrecursion preorder tarverse is: n); PreTraverseBT2(m); printf(n); printf(recursion inorder tarverse is: n); InTraverseBT(m); printf(n); printf(unrecursion inorder tarverse is n); InTraverseBT2(m); printf(n); printf(recursion postorder tarverse is: n); PoTraverseBT(m); printf(n); printf(u
12、nrecursion postorder tarverse is: n); PoTraverseBT(m); printf(n);四、运行结果注:前序创建二叉树,&代表输入字符结束标志图7 程序运行结果图五、遇到的问题及解决这部分我主要遇到了如下两个问题,其内容与解决方法如下所列: 在创建二叉树的时候,不知道如何结束当前的输入。每次都会进入到死循环当中。解决方法:经过一段时间的思考,在 函数中加入了一个标识符来识别是否输入结束。 如何实现非递归的后序遍历,问题如图8 图8 程序运行结出现的问题 解决方法:由于非递归的后序遍历和非递归前中序遍历不一样,因此经过一段时间的考虑,可以通过对节点两次入栈和两次出栈来实现,当节点第二次出栈时,输出节点的内容,因此增加一个标志量来表示节点是第几次入栈和出栈,从而实现了非递归后序遍历。六、心得体会 其实总体来说这次的实验比上次的那个表达式计算的实验简单一些,代码少一些,但是总觉得理解上还是有一点不到位,尤其递归的算法总是感觉理解的不是非常透彻,但是经过老师细致耐心的讲解以及自己的学习,总体上来说学到了不少知识,对二叉树有了进一步的体会,原来只是在书本上学习理论知识,如今真正上机做实验才发现还有好多感到困难的地方,由此可得,只有理论知识与实践相互结合,才能更好的掌握所学习的知识,因此,在以后的学习中,我会更加注重实践的重要性,争取做一个有用的人。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1