计科一二班算法数据结构实验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;



目录
相关文章
|
8月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
504 1
|
8月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
229 0
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
395 10
 算法系列之数据结构-二叉树
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
380 3
 算法系列之数据结构-Huffman树
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
536 22
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
483 30
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
708 25
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
854 23
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
265 20
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
624 3

热门文章

最新文章