用递归、非递归两种方法遍历二叉树..docxVIP

  • 12
  • 0
  • 约6.19千字
  • 约 13页
  • 2021-05-31 发布于山东
  • 举报

用递归、非递归两种方法遍历二叉树..docx

精品文档 精品文档 PAGE PAGE13 精品文档 PAGE 用递归、非递归两种方法遍历二叉树 一、设计思想 二叉树的遍历分为三种方式,分别是先序遍历,中序遍历和后序遍历。先序遍历实现的次序是:根左右,中序遍历实现的是:左根右,后续遍历实现的是:左右根。 根据不同的算法分,又分为递归遍历和非递归遍历。 递归算法: 1.先序遍历: 先序遍历就是首先判断根结点是否为空, 为空则停止遍历, 不为空则将左子作为新的根 结点从头进行上述判断, 左子遍历结束后,再将右子作为根结点判断, 直至结束。抵达每一 个结点时,打印该结点数据,即得先序遍历结果。 2.中序遍历: 中序遍历是首先判断该结点是否为空,为空则结束,不为空则将左子作为根结点再进行判断,打印左子,然后打印二叉树的根结点,最后再将右子作为参数进行判断,打印右子, 直至结束。 3.后序遍历: 指针抵达一个结点时,判断该结点是否为空,为空则停止遍历,不为空则将左子作为新的结点参数进行判断,打印左子。左子判断达成后,将右子作为结点参数传入判断,打印右 子。左右子判断达成后打印根结点。 非递归算法: 1.先序遍历: 首先成立一个栈,当指针抵达根结点时,打印根结点,判断根结点是否有左子和右子。 有左子和右子的话就打印左子同时将右子入栈,将左子作为新的根结点进行判断,方法同上。若目前结点没有左子,则直接将右子打印,同时将右子作为新的根结点判断。若目前结点没有右子,则打印左子,同时将左子作为新的根结点判断。若目前结点既没有左子也没有右子,则目前结点为叶子结点,此时将从栈中出栈一个元素,作为目前的根结点,打印结点元素, 同时将目前结点同样按上述方法判断,依次进行。直至目前结点的左右子都为空,且栈为空时,遍历结束。 2.中序遍历: 首先成立一个栈,首先将指针指向根结点,将根结点入栈,然后将指针指向左子, 左子 作为新的结点,将新结点入栈, 然后再将指针指向目前结点的左子,直至左子为空,则指针 返回,出栈一个元素,作为目前结点,打印该结点,然后将指针指向目前结点右子,将右子 作为新的结点,结点入栈,再次进行上面的判断, 直至目前结点右子也为空,则再出栈一个 元素作为目前结点,一直到结束,使得目前结点右子为空,且栈空,遍历结束。 3.后续遍历: 首先从根节点开始遍历, 看根节点是否为空, 如果根节点不为空, 将根节点的元素压入 栈中,持续遍历,如果根节点有左子,索引移动到左子,并以左子为根节点持续遍历。如果左子不为空,则索引移动到左子并入栈;如果左子为空,索引移动到栈顶元素所在的节点, 如果此节点的右子不为空并且右子没有被接见过, 则索引移动到右子, 否则接见栈顶元素并 输出,并且定义此节点为被接见过得节点, 栈顶元素出栈,树节点定义为 NULL,持续遍历。 二、算法流程图 递归算法: -1- 用递归、非递归两种方法遍历二叉树 创建二叉树 调用自己 调用对应函数 输出结果 图1递归算法流程图 先序非递归遍历: 得到根节点 输出目前节点 判断目前节点 是否存在左子 不存在 目前节点 是否存在右子 不存在 出栈,目前节 不为空 栈是否为空 点为出栈元 素 图2先序遍历的非递归算法流程图  存在目前节点的元素入栈,目前节点移动到左子上 存在 目前节点跳 到右子上 为空 结束 -2- 用递归、非递归两种方法遍历二叉树 中序非递归遍历: 得到根节点 判断目前节点 是否存在左子 不存在 输出目前节点 判断目前节点 是否存在右子 不存在 出栈,目前节 不为空 点为出栈元 栈是否为空 素  存在 目前节点的元素 入栈,目前节点 移动到左子上 目前节点跳 存在 到右子上 为空 结束 图3中序遍历的非递归算法流程图 -3- 用递归、非递归两种方法遍历二叉树 后序非递归遍历: 得到根节点 判断目前节点 是否存在左子 不存在 判断目前节点 是否存在右子 不存在 输出目前节点 出栈,目前节 不为空 点为出栈元 栈是否为空 素  目前节点的元素 存在 入栈,目前节点 移动到左子上 存在 目前节点跳 到右子上 为空 结束 图4后序遍历的非递归算法流程图 -4- 用递归、非递归两种方法遍历二叉树 三、源代码 前序非递归 #includestdio.h structelement //用构造体建立二叉树元素 { structelement*lchild; intdata; structelement*rchild; }; intmain() { inti=1; structelement*stack[30]; structelementa,b,c,d,e; //建立二叉树 a.data=1;b.data=2;c.data=3;d.data=4;e.data=5; a.lchild=b;a.rchild=c; b.lchild=

文档评论(0)

1亿VIP精品文档

相关文档