c语言实现一.二叉树操作 二.用栈实现算术表达式求值 课设报告

  • 格式:doc
  • 大小:114.50 KB
  • 文档页数:19

下载文档原格式

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

目录

题目一.二叉树操作(1)二.算术表达式求 (1)

一、课程设计的目的 (1)

二、课程设计的内容和要求 (1)

三、题目一设计过程 (2)

四、题目二设计过程 (6)

五、设计总结 (17)

六、参考文献 (18)

题目一.二叉树操作(1)二.算术表达式求

一、课程设计的目的

本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。

(1)题目一的目的:

1、掌握二叉树的概念和性质

2、掌握二叉树的存储结构

3、掌握二叉树的基本操作

(2)题目二的目的:

1、掌握栈的顺序存储结构和链式存储结构

2、掌握栈的先进后出的特点

3、掌握栈的基本运算

二、课程设计的内容和要求

(1)题目一的内容和要求:

1、编写已知二叉树的先序、中序序列,恢复此二叉树的程序

2、编写求二叉树深度的程序

(2)题目二的内容和要求:

1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为

加减乘除,界限符有左右括号和表达式起始

2、将一个表达式的中缀形式转化为相应的后缀形式

3、依据后缀表达式计算表达式的值

三、题目一设计过程

1、题目分析

现已知一棵二叉树的先序遍历序列和中序遍历序列,依次从先序遍历序列中取结点,由先序序列确定根结点(就是第一个字母),每次取出一个结点就与中序遍历的序列进行比较,当相等的时候,中序遍历序列就被分成以该结点为根的二叉树子树,该结点左部分为左子树,右部分为右子树,直到取完先序列里的所有结点,则二叉树构造完毕(树用链式存储结构存储),用递归实现!

由建好的二叉树,先判断这棵树是否为空,若不为空则找数的左子树,统计它的高度,然后找树的右子树,统计它的高度,比较左子树和右子树的高度,然后返回其中大的那个值加一,则求出数的高度。这里用递归实现!

2、算法描述

main ( )(主函数)

先构造一颗二叉树,初始化为空,用来存储所构造的二叉树,并输入一棵树的先序序列和中序序列,并统计这个序列的长度。然后调用实现功能的函数。

void CreateBiTree(BiTree *T,char *pre,char *in,int len)(由先序序列和中序序列构造二叉树)

根据前序遍历的特点, 知前序序列(pre)的首个元素(pre[0])为根(root), 然后在中序序列(in)中查找此根(pre[0]), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为左子树, 后边的序列为右子树。设根前边有n个元素,则又有, 在前序序列中,紧跟着根(root)的n个元素序列(即pre[1...n]) 为左子树, 在后边的为右子树,而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为pre[1...n]), 中序序列为in[0...n-1], 分别为原序列的子串, 构造右子树同样。这里用递归实现!

int Depth(BiTree T)(求树的深度)

当所给的参数T是NULL时,返回0。说明这个树只有一个叶子节点深度为0,当所给的参数不是NULL时,函数调用自己看看这个参数的左分支是不是NULL,

如果不是继续调用自己看看左分支的左分支是不是NULL,直到最后一个的左分支是NULL。然后看与最后一个左分支并列的右分支是不是NULL,不是的话自动调用自己,直到是NULL。同理求出右分支,然后左分支深度和右分支深度比较,返回值大的作为深度。

3、源代码

#include

#include

typedef struct Node

{

char data;

struct Node *lchild;

struct Node *rchild;

}*BiTree,BitNode;

void InitBitTree(BiTree *T);//初始化一棵树

void CreateBiTree(BiTree *T,char *pre,char *in,int len);//由先序序列和中序序列构造二叉树

int Depth(BiTree T);//求树的深度

void main()

{

BiTree T;

InitBitTree(&T);

char a[50],b[50];

int i,len=0,j;

printf("请输入一棵二叉树的先序序列:");

gets(a);

printf("请输入一棵二叉树的中序序列:");

gets(b);

for(i=0;i<50;i++)

{

if(a[i]!='\0')

len++;

else

break;

}

CreateBiTree(&T,a,b,len);

j=Depth(T);

printf("这棵树的深度是:%d\n",j);

}

void InitBitTree(BiTree *T)//初始化一棵树

{

*T=NULL;

}

void CreateBiTree(BiTree *T,char *pre,char *in,int len)//由先序序列和中序序列构造二叉树

{

int k;

char *temp;

if(len<=0)

{

*T=NULL;