计科一二班算法数据结构实验9答案

简介: 计科一二班算法数据结构实验9答案

第一种做法:

/*=================
函数功能:计算叶子结点,查找x,计算x左子树
作者:令狐荣豪
时间:2019/5/
==================*/
#include<stdio.h>
#include<stdlib.h> 
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 10
//Status函数的类型,其值是函数结果状态代码,如OK等
typedef int Status;
typedef char DataType;
//二叉树链式存储的结构体 
typedef struct Node {
 DataType  data;
 struct Node *lchild;
 struct Node *rchild;
}BiTNode, *BiTree;
BiTree TRoot;
//先序序列创建二叉树 
Status CreateBiTree(BiTree *T)//&的意思是传进来节点指针的引用,目的是让传递进来的指针发生改变 
{
 char ch;
 scanf("%c", &ch); //输入字符 
 if (ch == '#') //判断字符是否为“#”
  *T = NULL; //将根节点置为NULL,结束该分支的的递归 
 else {
  if (!(*T = (BiTree)malloc(sizeof(BiTNode)))) //创建新结点空间 
   return OVERFLOW; //空间分配不成功则返回OVERFLOW 
  (*T)->data = ch; //将字符存储到结点的值域 
  CreateBiTree(&(*T)->lchild); //递归创建左子树 
  CreateBiTree(&(*T)->rchild); //递归创建右子树 
 }
 return OK;
}
void InOrderOut(BiTree T)//中序遍历一遍
{
 if (T)
 {
  InOrderOut(T->lchild);
  printf("%3c", T->data);
  InOrderOut(T->rchild);
 }
}
//求二叉树叶子结点个数 
int CountLeaf(BiTree T) {
 if (T == NULL){ 
  return (0); }
  
 if (T->lchild == NULL&&T->rchild == NULL)
 {
  return (1);
 }
  
 return (CountLeaf(T->lchild) + CountLeaf(T->rchild));
 
}
//在树中查找x是否存在 
BiTree Search(BiTree T, DataType x) {
 if (T->data == x)
  return T;
 if (T->lchild !=NULL)
  return Search(T->lchild, x);
 if (T->rchild != NULL)
  return Search(T->rchild, x);
 return NULL;
 
}
//查找T的左孩子 
BiTree SearchLchild(BiTree T) {
 BiTree p;
 if (T == NULL)
  return NULL;
 else
  return (T->lchild);
}
int main()
{
 DataType x;
 BiTree p, q;
 printf("请输入先序序列(虚结点用#表示):\n");
 if (CreateBiTree(&TRoot) == OK)
  printf("二叉树创建成功!\n");
 InOrderOut(TRoot);
 printf("\n叶子结点数为:%d\n", CountLeaf(TRoot));
 
 x=getchar();//消除存储区的回车字符
 printf("请输入要查找的元素:\n");
 x=getchar();
 p=Search(TRoot, x);
 if (p)
  printf("存在\n");
 else
  printf("不存在\n");
 q=SearchLchild(p);
 if (q)
  printf("左结点为%c",q->data);
 //其他操作代码
 return 0;

第二种做法:

/*=================
函数功能:计算叶子结点,查找x,计算x左子树
作者:令狐荣豪
时间:2019/5/
==================*/
#include<stdio.h>
#include<stdlib.h> 
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 10
//Status函数的类型,其值是函数结果状态代码,如OK等
typedef int Status;
typedef char DataType;
//二叉树链式存储的结构体 
typedef struct Node {
  DataType  data;
  struct Node *lchild;
  struct Node *rchild;
}BiTNode, *BiTree;
BiTree TRoot;
//先序序列创建二叉树 
Status CreateBiTree(BiTree *T)//&的意思是传进来节点指针的引用,目的是让传递进来的指针发生改变 
{
  char ch;
  scanf("%c", &ch); //输入字符 
  if (ch == '#') //判断字符是否为“#”
    *T = NULL; //将根节点置为NULL,结束该分支的的递归 
  else {
    if (!(*T = (BiTree)malloc(sizeof(BiTNode)))) //创建新结点空间 
      return OVERFLOW; //空间分配不成功则返回OVERFLOW 
    (*T)->data = ch; //将字符存储到结点的值域 
    CreateBiTree(&(*T)->lchild); //递归创建左子树 
    CreateBiTree(&(*T)->rchild); //递归创建右子树 
  }
  return OK;
}
void InOrderOut(BiTree T)//中序遍历一遍
{
  if (T)
  {
    InOrderOut(T->lchild);
    printf("%3c", T->data);
    InOrderOut(T->rchild);
  }
}
//求二叉树叶子结点个数 
int CountLeaf(BiTree T) {
  if (T == NULL){ 
    return (0); }
    
  if (T->lchild == NULL&&T->rchild == NULL)
  {
    return (1);
  }
    
  return (CountLeaf(T->lchild) + CountLeaf(T->rchild));
  
}
//在树中查找x是否存在 
BiTree Search(BiTree T, DataType x) {
  if (T->data == x)
    return T;
  if (T->lchild !=NULL)
    return Search(T->lchild, x);
  if (T->rchild != NULL)
    return Search(T->rchild, x);
  return NULL;
  
}
//查找T的左孩子 
BiTree SearchLchild(BiTree T) {
  BiTree p;
  if (T == NULL)
    return NULL;
  else
    return (T->lchild);
}
int main()
{
  DataType x;
  BiTree p, q;
  printf("请输入先序序列(虚结点用#表示):\n");
  if (CreateBiTree(&TRoot) == OK)
    printf("二叉树创建成功!\n");
  InOrderOut(TRoot);
  printf("\n叶子结点数为:%d\n", CountLeaf(TRoot));
  
  
  printf("请输入要查找的元素:\n");
  
  scanf("%s", &x);
  p=Search(TRoot, x);
  if (p)
    printf("存在\n");
  else
    printf("不存在\n");
  q=SearchLchild(p);
  if (q)
    printf("左结点为%c",q->data);
  //其他操作代码
  return 0;
}

第三种做法:

/*=================
函数功能:计算叶子结点,查找x,计算x左子树
作者:令狐荣豪
时间:2019/5/
==================*/
#include<stdio.h>
#include<stdlib.h> 
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 10
//Status函数的类型,其值是函数结果状态代码,如OK等
typedef int Status;
typedef char DataType;
//二叉树链式存储的结构体 
typedef struct Node {
 DataType  data;
 struct Node *lchild;
 struct Node *rchild;
}BiTNode, *BiTree;
BiTree TRoot;
//先序序列创建二叉树 
Status CreateBiTree(BiTree *T)//&的意思是传进来节点指针的引用,目的是让传递进来的指针发生改变 
{
 char ch;
 scanf("%c", &ch); //输入字符 
 if (ch == '#') //判断字符是否为“#”
  *T = NULL; //将根节点置为NULL,结束该分支的的递归 
 else {
  if (!(*T = (BiTree)malloc(sizeof(BiTNode)))) //创建新结点空间 
   return OVERFLOW; //空间分配不成功则返回OVERFLOW 
  (*T)->data = ch; //将字符存储到结点的值域 
  CreateBiTree(&(*T)->lchild); //递归创建左子树 
  CreateBiTree(&(*T)->rchild); //递归创建右子树 
 }
 return OK;
}
void InOrderOut(BiTree T)//中序遍历一遍
{
 if (T)
 {
  InOrderOut(T->lchild);
  printf("%3c", T->data);
  InOrderOut(T->rchild);
 }
}
//求二叉树叶子结点个数 
int CountLeaf(BiTree T) {
 if (T == NULL){ 
  return (0); }
  
 if (T->lchild == NULL&&T->rchild == NULL)
 {
  return (1);
 }
  
 return (CountLeaf(T->lchild) + CountLeaf(T->rchild));
 
}
//在树中查找x是否存在 
BiTree Search(BiTree T, DataType x) {
 if (T->data == x)
  return T;
 if (T->lchild !=NULL)
  return Search(T->lchild, x);
 if (T->rchild != NULL)
  return Search(T->rchild, x);
 return NULL;
 
}
//查找T的左孩子 
BiTree SearchLchild(BiTree T) {
 BiTree p;
 if (T == NULL)
  return NULL;
 else
  return (T->lchild);
}
int main()
{
 DataType x;
 BiTree p, q;
 printf("请输入先序序列(虚结点用#表示):\n");
 if (CreateBiTree(&TRoot) == OK)
  printf("二叉树创建成功!\n");
 InOrderOut(TRoot);
 printf("\n叶子结点数为:%d\n", CountLeaf(TRoot));
 //少用这种%c的输入法
 scanf("%c",&x);//消除存储区的回车字符
 printf("请输入要查找的元素:\n");
 scanf("%c",&x);
 p=Search(TRoot, x);
 if (p)
  printf("存在\n");
 else
  printf("不存在\n");
 q=SearchLchild(p);
 if (q)
  printf("左结点为%c",q->data);
 //其他操作代码
 return 0;



目录
相关文章
|
25天前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
77 4
|
1月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
56 4
|
1月前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
44 4
|
1月前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
51 4
|
1月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
41 4
|
1月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
53 4
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
92 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
22天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
1月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
96 23
|
21天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
50 1
下一篇
DataWorks