C++数据结构实验二:树和二叉树

目录

实验内容

一、实验目的

二、问题分析及数据结构设计

三、算法设计

三、功能模块程序流程图

五、实验结果

六、算法分析

七、操作说明

八、源代码


近来有空闲,把前几个学期做的实验上传上来。如有错误的地方欢迎大佬批评指正,有更好的方法也期待您的分享~


实验内容

1.编写函数,输入字符序列,建立二叉树的二叉链表。

2.编写函数,实现二叉树的中序递归遍历算法。(最好也能实现前缀和后缀遍历算法)

3.编写函数,实现二叉树的中序非递归遍历算法。

4.编写函数,借助队列实现二叉树的层次遍历算法。

5.编写函数,求二叉树的高度。

6.编写函数,求二叉树的结点个数。

7.编写函数,求二叉树的叶子个数。

8.编写函数,交换二叉树每个结点的左子树和右子树。

9.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。


一、实验目的

1.熟悉二叉树遍历的各种算法;

2.掌握采用递归实现二叉树遍历算法的方法;

3.深刻理解栈在递归中的作用,进而学会递归转为非递归的方法;

4.训练在编程上控制复杂结构的能力,为今后控制更为复杂结构,进而解决有一定难度的复杂问题奠定基础。

二、问题分析及数据结构设计

本次开发任务要求我们编写一个能调试几种表示和操作二叉树算法的系统。该任务需要实现以下功能:建立二叉链表、二叉树的递归遍历(中序、前缀和后缀)、非递归的中序遍历、层次遍历、计算二叉树的高度、结点数、叶子数、交换每个节点的左右子树等。

其次是数据结构设计,为了实现这些功能,我们需要构建数据模型。二叉树的链式存储结构是指用一个链表存储一棵二叉树,二叉树中的每个结点用链表中的一个链结点存储。在二叉树中,标准存储方式的结点结构为(lchild,data,rchild),其中,data 为值成员变量,用于存储对应的数据元素,lchild 和 rchild 分别为左右指针变量,分别用于存储左孩子结点和右孩子结点(即左、右子树的根结点)的地址。

对于每个功能,我们需要设计相应的函数,函数的输入参数和返回值根据具体的需求进行设计。例如,建立二叉链表的函数使用字符序列x作为输入,返回一个根节点的指针;非递归遍历函数使用节点指针p作为输入,输出遍历的结果等。另外,在实现层次遍历功能的过程中,需要使用辅助的数据结构队列 enqueue() 来存储当前层次的节点。从根节点开始,调用 queue() 将其入队,然后不断从队列中取出节点,将其所有子节点入队,直到队列为空,这样就可以保证按照层次顺序遍历整个树或图。

三、算法设计

1.二叉链的链式存储结构BiTNode:

(1)使用 #define 定义二叉树结点值 ElemType 的类型为字符型;

(2)定义二叉链表结构体 BiTNode

(3)定义结点数据元素 data,结构体中的 lchild 指向左孩子结点, rchild 指向右孩子结点

(4)声明二叉链表变量 BiTNode。

图(a)所示的二叉树对应的二叉链存储结构如图(b)所示,整颗二叉树通过根结点r唯一标识。

图1 二叉树及其二叉链存储结构

2.建立二叉树的二叉链表 create_tree():

(1)输入一个字符串,若某一字符为“#”,则将该位置的结点设为空;

(2)将该结点的数据域置为该位置的字符,初始化指向父结点的指针为空。

(3)若该结点的左孩子不为空,用递归的形式建立其左孩子,并记下左孩子的父亲,即为该结点。同理对右孩子。

(4)最后return 根结点,此时便建立了一个二叉树。

3.二叉树的中序递归遍历算法 inorder():

(1)从根节点t出发,判断当前结点是否为null;

(2)如果不为null,则通过递归调用 inorder(t->lchild) 中序遍历左子树;

(3)t->data访问根节点;

(4)通过递归调用 inorder(t->rchild) 中序遍历右子树。

对于图1(a)所示的二叉树,其中序遍历过程如图2所示,在每个结点底部画一条线与虚线相交,该相交点表示访问点,然后按虚线遍历次序列出相交点得到中序遍历序列,即DGBAECF。

图2 二叉树的中序递归遍历过程

4.二叉树的前缀递归遍历算法 preorder():

(1)从根节点t出发,判断当前结点是否为null;

(2)t->data访问根节点;

(3)如果不为null,则通过递归调用 inorder(t->lchild) 中序遍历左子树;

(4)通过递归调用 inorder(t->rchild) 中序遍历右子树。

对于图1(a)所示的二叉树,其先序遍历过程如图3所示,图中虚线表示这种遍历过程,在每个结点左边画一条线与虚线相交,该相交点表示访问点,然后按虚线遍历次序列出相交点得到先序遍历序列,即ABDGCEF。

图3 二叉树的先序递归遍历过程

5.二叉树的后缀递归遍历算法 pasorder():

(1)从根节点t出发,判断当前结点是否为null;

(2)如果不为null,则通过递归调用 inorder(t->lchild) 中序遍历左子树;

(3)通过递归调用 inorder(t->rchild) 中序遍历右子树。

(4)t->data访问根节点;

对于图1(a)所示的二叉树,其后序遍历过程如图4所示,在每个结点右边画一条线与虚线相交,该相交点表示访问点,然后按虚线遍历次序列出相交点得到后序遍历序列,即GDBEFCA。</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值