数据结构_二叉树_实验报告 北邮
- 格式:doc
- 大小:139.50 KB
- 文档页数:10
2011级数据结构实验报告实验名称:实验三——二叉树
学生姓名:
班级:
班内序号:
学号:
日期:2012年12月3日
1.实验要求
1.1实验目的
通过选择下面两个题目之一进行实现,掌握如下内容:
➢掌握二叉树基本操作的实现方法
➢了解赫夫曼树的思想和相关概念
➢学习使用二叉树解决实际问题的能力
1.2实验内容
根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。
二叉树的基本功能:
1、二叉树的建立
2、前序遍历二叉树
3、中序遍历二叉树
4、后序遍历二叉树
5、按层序遍历二叉树
6、求二叉树的深度
7、求指定结点到根的路径
8、二叉树的销毁
9、其他:自定义操作
编写测试main()函数测试线性表的正确性
2. 程序分析
2.1 存储结构
二叉树的结点结构
二叉树的二叉链表存储示意图
2.2 关键算法分析
(1)创建一个二叉树
通过构造函数创建一个二叉树,构造函数通过调用函数creat()创建二
叉树
关于函数creat()的伪代码:
1.定义根指针,输入节点储存的data,若输入“#”,则该节点为空;
2.申请一个新节点,判断它的父结点是否不为空,如果不为空在判断其为左或
者右孩子,并把地址付给父结点,把data写入。
char ch;
BiNode
int front,rear;
BiNode
root=NULL;
front=1;rear=0;
cout<<("按层次输入二叉树虚结点输入'#',以'@'结束输入\n");
cin>>ch;
while(ch!='@')
{
S=NULL;
if(ch!='#')
{
S=new BiNode
S->data=ch;
S->lchild=NULL;
S->rchild=NULL;
}
rear++;
Q[rear]=S; //结点入队
if(rear==1)
root=S;
else
{
while(Q[front]== NULL&&front { front++; } if (front==rear) break; if(rear%2==0) Q[front]->lchild=S; //新结点为父结点的左孩子else { Q[front]->rchild=S; //新结点为父结点的右孩子 front++; } } cin>>ch; } return root; } (2)前序遍历 伪代码: 1.设置递归边界条件:if root==null则停止递归 2.打印起始节点的值,并先后在左子数右子数上递归调用打印函数 if(root==NULL) return; else{ cout< PreOrder(root->lchild); PreOrder(root->rchild); } 时间复杂度:O(n) (3)中序遍历 伪代码: 1.设置递归边界条件:if root==null则停止递归 2.递归遍历左子树 3.打印根节点数据域内容 4.递归遍历右子树 if (root==NULL) return; //递归调用的结束条件 else{ InOrder(root->lchild); //中序递归遍历root的 左子树 cout< InOrder(root->rchild); //中序递归遍历root的 右子树 } 时间复杂度:O(n) (4)后序遍历 伪代码: 1.设置递归边界条件:if root==null则停止递归 2.递归遍历左子树 3.递归遍历右子树 4.访问根结点数据域 if (root==NULL) return; //递归调用的结 束条件 else{ PostOrder(root->lchild); //后序递归遍历 root的左子树 PostOrder(root->rchild); //后序递归遍历 root的右子树 cout< 数据域 } 时间复杂度:O(n) (5)层序遍历 1.队列Q及所需指针的定义和初始化 2.如果二叉树非空,将根指针入队 3.循环直到队列Q为空 3.1 q=队列Q的队头元素出队 3.2 访问节点q的数据域 cout< 3.3 若节点q存在左孩子,则将左孩子指针入队 if (q->lchild != NULL) Q[rear++] = q->lchild; 3.4若节点q存在右孩子,则将右孩子指针入队 if (q->rchild != NULL) 时间复杂度:O(n) (6)计算二叉树深度 伪代码: 1. 定义和初始化计数深度的参数 2.如果根节点为空,return0 3.如果根节点为非空,递归调用自身的到叶子节点到根的路径长度,输出其中较大的作为树的深度 if(!root) return 0; //空二叉子树深度为0 if(ldeep > rdeep) //ldeep就是每个“二叉 树”的左子树深度。 return ldeep + 1; //rdeep就是每个“二叉树” 的右子树深度。 时间复杂度:O(n) (7)计算树的叶结点数