一、需求分析与功能描述
现代社会生活中,计算机扮演着重要角色,而随着计算机运行速度的不断加快,对数据的处理能力也日益增强,因此,程序所涉及的数据很多,如何科学有效的对数据进行操作,使得计算机的时间和空间利用率最高是一个问题。针对这样的问题,我选择了二叉树对数据的各种操作作为我的课程设计主题,希望通过二叉树来提高对数据的处理能力,促进对数据结构课程的理解。
在二叉树的应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理,这就是二叉树的遍历问题。
对二叉树的数据结构进行定义,建立一颗二叉树,然后进行各种实验操作。
二、数据结构的选择与设计
在遍历算法的实现中使用了栈结构与队列结构,
这大大方便了二叉树的遍历。
( 数组,二叉树,栈,队列,)
三、算法的选择与设计
1 .建立二叉树结构
建立二叉树时,要先明确是按哪一种遍历规则输入,该二叉树是按你所输入的遍历规则来建立的。本实验用的是先序遍历的规则进 行建树。二叉树用链表存储来实现,因此要先定义一个二叉树链表存储结构。因此要先定义一个结构体。此结构体的每个结点都是 由数据域data、左指针域Lchild、右指针域Rchild组成,两个指针域分别指向该结点的左、右孩子。
2. 输入二叉树元素
输入二叉树时,是按上面所确定的遍历规则输入的。最后,用一个返回值来表示所需要的结果.
3. 先序遍历二叉树
当二叉树为非空时,执行以下三个操作:访问根结点、先序遍历左子树、先序遍历右子树。
4. 中序遍历二叉树
当二叉树为非空时,程序执行以下三个操作:访问根结点、先序遍历左子树、先序遍历右子树。
5. 后序遍历二叉树
当二叉树为非空时,程序执行以下三个操作:访问根结点、先序遍历左子树、先序遍历右子树。
6. 非递归方式的先序遍历:
① 输出节点P,然后将其入栈,再看P的左孩子是否为空;
② 若P的左孩子不为空,则置P的左孩子为当前节点,重复①的操作;
③ 若P的左孩子为空,则将栈顶节点出栈,但不输出,并将出栈节点的右孩子置为当前节点,看其是否为空;
④ 若不为空,则循环至①操作;
⑤ 如果为空,则继续出栈,但不输出,同时将出栈节点的右孩子置为当前节点,看其是否为空,重复④和⑤操作;
⑥ 直到当前节点P为NULL并且栈空,遍历结束。
7. 非递归方式的中序遍历:
① 若P的左孩子不为空,则将P入栈并将P的左孩子置为当前节点,然后再对当前节点进行相同的处理;
② 若P的左孩子为空,则输出P节点,而后将P的右孩子置为当前节点,看其是否为空;
③ 若不为空,则重复①和②的操作;
④ 若为空,则执行出栈操作,输出栈顶节点,并将出栈的节点的右孩子置为当前节点,看起是否为空,重复③和④的操作;
⑤ 直到当前节点P为NULL并且栈为空,则遍历结束。
8. 非递归的后序遍历:
① 先将节点P入栈;
② 若P不存在左孩子和右孩子,或者P存在左孩子或右孩子,但左右孩子已经被输出,则可以直接输出节点P,并将其出栈,将出栈节点P标记为上一个输出的节点,再将此时的栈顶结点设为当前节点;
③ 若不满足②中的条件,则将P的右孩子和左孩子依次入栈,当前节点重新置为栈顶结点,之后重复操作②;
④ 直