数据结构二叉树的实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构

1. 实验目的和内容:

掌握二叉树基本操作的实现方法

2. 程序分析

2.1存储结构

链式存储

2.程序流程

2.3关键算法分析

算法一:Create(BiNode* &R,T data[],int i,int n) 【1】算法功能:创建二叉树

【2】算法基本思想:利用顺序存储结构为输入,采用先建立根结点,再建立左右孩子的方法来递归建立二叉链表的二叉树

【3】算法空间时间复杂度分析:O(n)

【4】代码逻辑:

如果位置小于数组的长度则

{ 创建根结点

将数组的值赋给刚才创建的结点的数据域

创建左子树,如果当前结点位置为i,则左孩子位置为2i

创建右子树,如果当前结点位置为i,则右孩子位置为2i+1

}

否则R为空

算法二:CopyTree(BiNode*sR,BiNode* &dR)

【1】算法功能:复制构造函数

【2】算法基本思想:按照先创建根结点,再递归创建左右子树的方法来实现。

【3】算法空间时间复杂度分析:O(n)

【4】代码逻辑:

如果源二叉树根结点不为空

则{

创建根结点

调用函数自身,创建左子树

调用函数自身,创建右子树

}

将该函数放在复制构造函数中调用,就可以实现复制构造函数

算法三:PreOrder(BiNode*R)

【1】算法功能:二叉树的前序遍历

【2】算法基本思想:这个代码用的是优化算法,提前让当前结点出栈。【3】算法空间时间复杂度分析:O(n)

【4】代码逻辑(伪代码)

如果当前结点为非空,则

{

访问当前结点

当前结点入栈

将当前结点的左孩子作为当前结点}

如果为空

{

则栈顶结点出栈

则将该结点的右孩子作为当前结点

}

反复执行这两个过程,直到结点为空并且栈空算法四:InOrder(BiNode*R)

【1】算法功能:二叉树的中序遍历

【2】算法基本思想:递归

【3】算法空间时间复杂度分析:未知

【4】代码逻辑:

如果R为非空:

则调用函数自身遍历左孩子

访问该结点

再调用自身访问该结点的右孩子

算法五:LevelOrder(BiNode*R)

【1】算法功能:二叉树的层序遍历

【2】算法基本思想:

【3】算法空间时间复杂度分析:O(n)

【4】代码逻辑(伪代码):

若根结点非空,入队

如果队列不空

{

对头元素出队

访问该元素

若该结点的左孩子为非空,则左孩子入队;

若该结点的右孩子为非空,则右孩子入队; }

算法六:Count(BiNode*R)

【1】算法功能:计算结点的个数

【2】算法基本思想:递归

【3】算法空间时间复杂度分析:未知

【4】代码逻辑:

如果R不为空的话

{

调用函数自身计算左孩子的结点数

调用函数自身计算右孩子的结点数

}

template

int BiTree::Count(BiNode*R)

{

if(R==NULL)return 0;

else

{

int m=Count(R->lchild);

int n=Count(R->rchild);

return m+n+1;

}

}

算法七:Release(BiNode*R)

【1】算法功能:释放动态内存

【2】算法基本思想:左右子树全部释放完毕后再释放该结点【3】算法空间时间复杂度分析:未知

【4】代码逻辑:

调用函数自身,释放左子树

调用函数自身,释放右子树

释放根结点

释放二叉树

template

void BiTree::Release(BiNode*R)

{

if(R!=NULL)

{

Release(R->lchild);

Release(R->rchild);

delete R;

}

}

template

BiTree::~BiTree()

{

Release(root);

}

int main()

{

int a[10]={1,2,3,4,5,6,7,8,9,10};

BiTree BTree(a,10);

BiTreeTree(BTree);

BTree.PreOrder(BTree.root);

cout<

Tree.PreOrder(Tree.root);

cout<

BTree.InOrder(BTree.root);

cout<

Tree.InOrder(Tree.root);

cout<

BTree.PostOrder(BTree.root);

cout<

Tree.PostOrder(Tree.root);

cout<

BTree.LevelOrder(BTree.root);

cout<

Tree.LevelOrder(Tree.root);

cout<

int m=BTree.Count(BTree.root);

cout<

return 0;

}

3.测试数据:

int a[10]={1,2,3,4,5};

1 2 4 5 3

1 2 4 5 3

4 2

5 1 3

4 5 2 3 1

1 2 3 4 5

5

4.总结:

4.1:这次实验大多用了递归的算法,比较好理解。

4.2:新得体会:

在创建二叉树的过程中,在没有思路的时候可以巧妙的利用递归算法。

但是我的代码仍然应该改进,应该进一步简化,减少算法的时间复杂度和空间复杂度。

#include

using namespace std;

templateclass BiNode

{

public:

T data;

BiNode*lchild;

BiNode*rchild;

};

templateclass BiTree

{

public:

BiNode*root;

BiTree(T data[],int n);

BiTree(BiTree& r);

相关文档
最新文档