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



目录
相关文章
|
11月前
|
算法
代码随想录算法训练营第四十天 | LeetCode 343. 整数拆分、96. 不同的二叉搜索树
代码随想录算法训练营第四十天 | LeetCode 343. 整数拆分、96. 不同的二叉搜索树
55 1
|
编译器 C语言
C语言程序设计(王立柱)第八章答案 链表
只有聪明人才能看见的摘要~( ̄▽ ̄~)~
73 1
|
算法 C++
【每日算法Day 70】图解算法:小学生都会的数块数问题,你会吗?
【每日算法Day 70】图解算法:小学生都会的数块数问题,你会吗?
|
算法 程序员
【算法集训 | 暑期刷题营】8.2题---暴力递归之深搜
【算法集训 | 暑期刷题营】8.2题---暴力递归之深搜
【算法集训 | 暑期刷题营】8.2题---暴力递归之深搜
|
机器学习/深度学习 算法 JavaScript
【算法日记】快速幂:关于我知道答案却做不出来这档事
LeetCode第330场周赛,直接卡在了第二题😭,掉大分,学到一手快速幂。本文包含以下内容:快速幂,快速幂取余。
154 0
|
测试技术
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:6.分类计数
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:6.分类计数
83 0
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:6.分类计数
|
存储 算法 Java
算法学习入门Day1_Leetcode_70 爬楼梯 ~还是辣么滴丝滑 雀氏润
算法学习入门Day1_Leetcode_70 爬楼梯 ~还是辣么滴丝滑 雀氏润
算法学习入门Day1_Leetcode_70 爬楼梯 ~还是辣么滴丝滑 雀氏润
|
算法 数据处理
算法刷题力扣(算法--二分查找)(跑路人笔记)
算法刷题力扣(算法--二分查找)(跑路人笔记)
算法刷题力扣(算法--二分查找)(跑路人笔记)
|
存储 算法
重温算法之最长回文子串
关于回文的题目,核心思路还是依次比较,找到回文,然后进行其他的操作,另外官方题解中心扩散法也是一个最优解。
102 0
重温算法之最长回文子串
LeetCode每日一刷 --- 拿捏顺序表经典面试题
目录 1、移除元素 2、删除有序数组中的重复项 3、合并两个有序数组
LeetCode每日一刷 --- 拿捏顺序表经典面试题