文档详情

华北理工大学二叉树遍历报告.doc

发布:2018-02-07约5.54千字共14页下载文档
文本预览下载声明
数据结构(双语) ——项目文档报告 用递归、非递归两种方法遍历二叉树 专 业: 计算机科学与技术 班 级: 15计算机1班 指导教师: 苏亚光 姓 名: 学 号: 目 录 一、设计思想……………………………………………………….3 二、算法流程图…………………………………………………….4 三、源代码………………………………………………………….7 四、运行结果……………………………………………………….12 五、遇到的问题及解决…………………………………………….13 六、心得体会……………………………………………………….14 设计思想 程序代码是用两种算法实现二叉树的遍历,并输出遍历后的值。 第一种算法是递归实现二叉树的遍历 首先对于先序遍历,若二叉树为空,则空操作;否则,先访问根结点,然后先序遍历左子树,再先序遍历右子树。对于中序遍历,若二叉树为空,则空操作;否则,先中序遍历左子树,然后访问根节点,在中序遍历右子树。对于后续遍历,若二叉树为空,则空操作;否则,先后续遍历左子树,然后后续遍历右子树,在访问跟结点。 第二种算法是非递归实现二叉树的遍历 首先对于先序非递归遍历, 先序遍历是借用栈来实现的。 先声明并初始化一个栈。 首先站在根节点上, 对于根节点直接访问它, 即打印它的 data,再将其压入栈中, 再判断栈 stack是否为空,如果 stack 为空,则循环结束,遍历结束;如果不为空,则访问该根结点。对于其它结点上如果它有左子,则访问它的左子,即打印其左子中成员 data 的值,然后再将该左子压入栈中; 如果该结点没有左子,则弹出栈顶元素, 站在其右子所在的结点上,再对当前所在的结点是否有左子进行判断,此时进入了一个循环。循环结束的条件是栈 stack 和最后所在结点也为空。此时,所输出的结果即为先序遍历的结果。 对于中序非递归遍历,也是借用一个栈来实现的,先声明并初始化一个栈,站到一个结 点 a 上,如果当前结点 a 有左子 b,则将其左子 b 入栈,如果其左子 b 还有左子 c 也将当前所站的结点 b 入栈,循环此过程直到遇到没有左子的结点 p,此时弹出栈顶元素 p,并访问它,即打印 p 结点的 data,然后判断 p 结点的成员指针变量 right ,把 right 当成第一个开始的结点进行处理, 直到最后栈为空且当前所站得结点为 NULL ,则中序遍历结束。 所输出的结果即为中序遍历的结果。 对于后续非递归遍历, 它与前面两个不同, 要使用两个栈来实现。 先分别声明并初始化两个栈 stack 和 output,首先站在根结点上, 对于根结点是直接将根节点压入栈 stack 中。如果是其它的结点则首先要判断栈 stack 是否为空,然后才往下执行。如果当前栈 stack 不为空,则将 stack 中得栈顶元素 A 弹出并压入到栈 output 中,现在站在结点 A 上,先依次判断它是否有左右子, 如果它有左子, 则将其左子压入栈 stack 中,如果它有右子也将它压入栈 stack中,然后再判断栈 stack 是否为空, 如果不为空, 则弹出栈顶元素, 并将其压入栈 output 中,再对该元素进行左子、右子的判断。 到最后, stack 为空时,则此循环结束, 而此时栈 output中存储的则是已经按后续遍历排好的各个结点。 依次访问栈顶元素并弹出栈顶元素, 直到此栈为空,则所输出的结果即为后序遍历的结果。 算法流程图 图 1 为使用递归实现的先序遍历二叉树的流程图。 图 2 为使用递归实现的中序遍历二叉树的流程图 图 3 为使用递归实现的中序遍历二叉树的流程图 图 4 为使用非递归实现的先序遍历二叉树的流程图 图 5 为使用非递归实现的中序遍历二叉树的流程图 图 6 为使用非递归实现的后序遍历二叉树的流程图 图1先序遍历二叉树流程图 图2中序遍历二叉树流程图 图3后序遍历二叉树流程图 图4非递归先序遍历二叉树流程图 图5非递归中序遍历二叉树流程图 图6非递归后序遍历二叉树流程图 源代码 下面给出的是二叉树遍历实现的关键源代码: //前序递归遍历 void PreOrderTraverse(BiTree T) { if(T==NULL) return; printf(%c,T-data);/* 显示结点数据,可以更改为其它对结点操作 */ PreOrderTraverse(T-lchild); /* 再先序遍历左子树 */ PreOrderTraverse(T-rchild); /* 最
显示全部
相似文档