8606 二叉树的构建及遍历操作【有手就行】

Description

构造二叉链表表示的二叉树:按先序次序输入二叉树中结点的值(一个字符),’#'字符表示空树,构造二叉链表表示的二叉树T;再输出三种遍历序列。本题只给出部分代码,请补全内容。

#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK  1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int  Status;typedef char  ElemType;
typedef struct BiTNode{ElemType data;struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;Status CreateBiTree(BiTree &T) {  // 算法6.4// 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,// 构造二叉链表表示的二叉树T。char ch;scanf("%c",&ch);if (ch=='#') T = NULL;else {if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;________________________ // 生成根结点_______________________   // 构造左子树_________________________  // 构造右子树}return OK;
} // CreateBiTreeStatus PreOrderTraverse( BiTree T) {// 前序遍历二叉树T的递归算法//补全代码,可用多个语句} // PreOrderTraverseStatus InOrderTraverse( BiTree T) {// 中序遍历二叉树T的递归算法//补全代码,可用多个语句} // InOrderTraverseStatus PostOrderTraverse( BiTree T) {// 后序遍历二叉树T的递归算法//补全代码,可用多个语句} // PostOrderTraverseint main()   //主函数
{//补充代码}//main

输入格式

第一行:输入一棵二叉树的先序遍历序列

输出格式

第一行:二叉树的先序遍历序列
第二行:二叉树的中序遍历序列
第三行:二叉树的后序遍历序列

输入样例

AB##C##

输出样例

ABC
BAC
BCA

代码实现

#include "stdio.h"
#include "malloc.h"
#include <iostream>using namespace std;
#define TRUE 1
#define FALSE 0
#define OK  1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;typedef char ElemType;
typedef struct BiTNode {ElemType data;struct BiTNode *lchild, *rchild;//左右孩子指针
} BiTNode, *BiTree;Status CreateBiTree(BiTree &T) {  // 算法6.4// 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,// 构造二叉链表表示的二叉树T。char ch;scanf("%c", &ch);if (ch == '#') T = NULL;else {if (!(T = (BiTNode *) malloc(sizeof(BiTNode)))) return ERROR;T->data = ch; // 生成根结点CreateBiTree(T->lchild);   // 构造左子树CreateBiTree(T->rchild);  // 构造右子树}return OK;
} // CreateBiTreeStatus PreOrderTraverse(BiTree T) {// 前序遍历二叉树T的递归算法//补全代码,可用多个语句if (T == NULL)return ERROR;cout << T->data;PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);
} // PreOrderTraverseStatus InOrderTraverse(BiTree T) {// 中序遍历二叉树T的递归算法//补全代码,可用多个语句if (!T)return ERROR;InOrderTraverse(T->lchild);cout << T->data;InOrderTraverse(T->rchild);} // InOrderTraverseStatus PostOrderTraverse(BiTree T) {// 后序遍历二叉树T的递归算法//补全代码,可用多个语句if (!T)return ERROR;PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);cout << T->data;
} // PostOrderTraverseint main()   //主函数
{//补充代码BiTree P;CreateBiTree(P);PreOrderTraverse(P);cout<<endl;InOrderTraverse(P);cout<<endl;PostOrderTraverse(P);cout<<endl;
}//main

17121 求二叉树各种节点数【背关系】

Description

构造二叉链表表示的二叉树:按先序次序输入二叉树中结点的值(一个字符),’#'字符表示空树,构造二叉链表表示的二叉树T,并求此二叉树中度为2的节点总数,度为1的节点总数,度为0的节点总数

#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK  1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int  Status;typedef char  ElemType;
typedef struct BiTNode{ElemType data;struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;Status CreateBiTree(BiTree &T) {  // 算法6.4// 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,// 构造二叉链表表示的二叉树T。char ch;scanf("%c",&ch);if (ch=='#') T = NULL;else {if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;________________________ // 生成根结点_______________________   // 构造左子树_________________________  // 构造右子树}return OK;
} // CreateBiTreeint main()   //主函数
{//补充代码}//main

输入格式

第一行输入先序次序二叉树中结点

输出格式

第一行输出度为2的节点数
第二行输出度为1的节点数
第三行输出度为0的节点数

输入样例

ABC###D##

输出样例

1
1
2

代码实现

#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK  1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int  Status;typedef char  ElemType;
typedef struct BiTNode{ElemType data;struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;int n0=0,n=0;Status CreateBiTree(BiTree &T) {  // 算法6.4// 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,// 构造二叉链表表示的二叉树T。char ch;scanf("%c",&ch);if (ch=='#') T = NULL;else {if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;T->data=ch; // 生成根结点n++;CreateBiTree(T->lchild);// 构造左子树CreateBiTree(T->rchild);  // 构造右子树}return OK;
} // CreateBiTreevoid f(BiTree &T){if(!T)return;if(!T->lchild&&!T->rchild)n0++;f(T->lchild);f(T->rchild);
}int main()   //主函数
{//补充代码BiTree T;CreateBiTree(T);f(T);printf("%d\n%d\n%d\n",n0-1,n-2*n0+1,n0);//n0为叶子节点数//叶子节点数=度2节点数+1//所有节点树-叶子节点树-度2节点数=度1节点数
}//main

18924 二叉树的宽度【可偷懒】

Description

二叉树的宽度指的是具有节点数目最多的那一层的节点个数。
1
/
2 3
/
4
答案为2, 第二层节点数最多,为2个节点。

输入格式

共n行。
第一行一个整数n,表示有n个结点,编号为1至n,结点1为树根。(1<=n<=50)
第二行至第n行,每行有两个整数x和y,表示在二叉树中x为y的父节点。x第一次出现时y为左孩子

输出格式

输出二叉树的宽度。

输入样例

5
1 2
1 3
2 4
2 5

输出样例

2

代码实现【二维数组偷懒法】

#include <iostream>
#include <vector>
using namespace std;
int main() {vector<vector<int>> array(50);array[0].push_back(1);int n;cin >> n;for(int i=0;i<n-1;i++){int x,y;cin>>x>>y;for(int j=0;j<50;j++){if(array[j].back()>=x){array[j+1].push_back(y);break;}}}int max=0;for(int i=0;i<50;i++){if(max<array[i].size())max=array[i].size();}cout << max<<endl;return 0;
}

18724 二叉树的遍历运算【值得一看★】

Description

二叉树的三种遍历都可以通过递归实现。
如果我们知道一棵二叉树的先序和中序序列,可以用递归的方法求后序遍历序列。

输入格式

两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。

输出格式

一个字符串,树的后序序列。

输入样例

abcde
bcade

输出样例

cbeda

代码实现

#include <iostream>
#include <cstring>
using namespace std;char pre[1000],mid[1000],res[1000];
void cut(char pre[],char mid[],int len,int loc){if(len<=0)return;int i=0;while(pre[0]!=mid[i])i++;//找到中序中的根节点cut(pre+1,mid,i,loc-(len-i-1)-1);//loc - 右子树长度 - 1 = 左子树根节点该在的位置,也就是根节点左边的字符cut(pre+i+1,mid+i+1,len-i-1, loc - 1);//loc - 1  = 右子树根节点该在的位置,也就是res[loc]=pre[0];//loc 为 根节点在后序序列中该在位置
}int main() {cin>>pre>>mid;int len=strlen(mid);cut(pre,mid,len,len-1);cout<<res<<endl;return 0;
}

18923 二叉树的直径【值得一看★】

Description

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
1
/
2 3
/ \
4 5
答案为3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

输入格式

共n行。
第一行一个整数n,表示有n个结点,编号为1至n。
第二行至第n行,每行有两个整数x和y,表示在二叉树中x为y的父节点。x第一次出现时y为左孩子

输出格式

输出二叉树的直径。

输入样例

5
1 2
1 3
2 4
2 5

输出样例

3

代码实现

#include "stdio.h"
#include "malloc.h"
#include <iostream>using namespace std;
typedef int ElemType;typedef struct BiTNode {ElemType data;struct BiTNode *lchild, *rchild;//左右孩子指针
} BiTNode, *BiTree;//插入数据到指定树下
void insertData(BiTree &T, ElemType data) {BiTree P = new BiTNode;//P是一个新子树指针P->data = data;P->lchild = NULL;P->rchild = NULL;if (T == NULL) {T = P;}//先左后右else {if (T->lchild == NULL) {T->lchild = P;} else {T->rchild = P;}}
}//先序查找父元素
void preOrderSearch(BiTree T, ElemType x, BiTree &result) {if (T) {//cout <<"CMP "<< T->data <<" AND "<<x<<endl;if (T->data == x){result = T;}preOrderSearch(T->lchild, x, result);preOrderSearch(T->rchild, x, result);}
} // PreOrder//递归求最大深度
int maxDiameter = 0;
int MaxDepth(BiTree &T) {if (T == NULL) return 0;int leftDepth = MaxDepth(T->lchild);int rightDepth = MaxDepth(T->rchild);int diameter = leftDepth + rightDepth;maxDiameter = diameter > maxDiameter ? diameter : maxDiameter;return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}int main()   //主函数
{BiTree P = NULL;int n;cin >> n;n--;insertData(P, 1);//第一个节点,手动插入(待优化)// PreOrderShow(P);while (n--) {ElemType f, z;cin >> f >> z;BiTree res = NULL;preOrderSearch(P, f, res);//查找到要插入的子树insertData(res, z);//PreOrderShow(res);}MaxDepth(P);cout << maxDiameter;}//main

8609 哈夫曼树【值得一看★★★】

Description

利用静态链表建立赫夫曼树,建树过程中要求左子树权值小于右子树权值,求各结点的编码。要求:叶子结点的个数n及结点值由键盘录入。本题给出程序代码,要求修改以满足测试要求.

#include "stdio.h"
#include "malloc.h"
#include "string.h"
typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void   Select(HuffmanTree &HT, int n, int &s1, int &s2)
//在HT[1..n]中选择parent为0且weight最小的两个结点,
// 其序号分别为s1和s2。
{  int i;s1=-1;s2=-1;for (i=1;i<=n;i++) {if (HT[i].parent==0)if (s1==-1) s1=i;else if (s2==-1 )if (HT[i].weight0),构造哈夫曼树HT,// 并求出n个字符的哈夫曼编码HCint i, j, m, s1, s2, start;char *cd;unsigned int c, f;if (n<=1) return;m = 2 * n - 1;HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode));  // 0号单元未用for (i=1; i<=n; i++) { //初始化HT[i].weight=w[i-1];HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}for (i=n+1; i<=m; i++) { //初始化HT[i].weight=0;HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}printf("\n哈夫曼树的构造过程如下所示:\n");printf("HT初态:\n  结点  weight  parent  lchild  rchild");for (i=1; i<=m; i++)printf("\n%4d%8d%8d%8d%8d",i,HT[i].weight,HT[i].parent,HT[i].lchild, HT[i].rchild);printf("    按任意键,继续 ...");getch();for (i=n+1; i<=m; i++) {  // 建哈夫曼树// 在HT[1..i-1]中选择parent为0且weight最小的两个结点,// 其序号分别为s1和s2。Select(HT, i-1, s1, s2);HT[s1].parent = i;  HT[s2].parent = i;HT[i].lchild = s1;  HT[i].rchild = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;printf("\nselect: s1=%d   s2=%d\n", s1, s2);printf("  结点  weight  parent  lchild  rchild");for (j=1; j<=i; j++)printf("\n%4d%8d%8d%8d%8d",j,HT[j].weight,HT[j].parent,HT[j].lchild, HT[j].rchild);printf("    按任意键,继续 ...");getch();}//--- 从叶子到根逆向求每个字符的哈夫曼编码 ---cd = (char *)malloc(n*sizeof(char));    // 分配求编码的工作空间cd[n-1] = '\0';                         // 编码结束符。for (i=1; i<=n; ++i) {                  // 逐个字符求哈夫曼编码start = n-1;                          // 编码结束符位置for (c=i, f=HT[i].parent; f!=0; c=f, f=HT[f].parent) // 从叶子到根逆向求编码if (HT[f].lchild==c) cd[--start] = '0';else cd[--start] = '1';HC[i] = (char *)malloc((n-start)*sizeof(char)); // 为第i个字符编码分配空间strcpy(HC[i], &cd[start]);    // 从cd复制编码(串)到HC  }free(cd);   //释放工作空间
} //HuffmanCodingvoid main()
{int i,n;int *w;HuffmanTree HT;HuffmanCode HC;printf("Node Number:");scanf("%d",&n);  //权值个数w=(int *)malloc(n*sizeof(int));  printf("Input weights:");for ( i=0;i<n;i++)  //录入权值scanf("%d",&w[i]);HC=(char **)malloc((n+1)*sizeof(char*)); //0空间未用HT=(HuffmanTree)malloc((2*n+1+1)*sizeof(HTNode));//0空间未用HuffmanCoding(HT, HC, w, n);printf("\n");   for (i = 1; i<n+1; i++){puts(HC[i]);  //输出哈夫曼编码free(HC[i]);  //释放空间}free(HC);free(HT);
}//main

输入格式

第一行:权值个数
第二行:输入n个权值,用空格分隔

输出格式

输出n行
每行表示各权值对应的哈夫曼编码

输入样例

8
5 29 7 8 14 23 3 11

输出样例

0001
10
1110
1111
110
01
0000
001

代码实现

#include "stdio.h"
#include "malloc.h"
#include "string.h"#include <iostream>using namespace std;typedef struct {unsigned int weight;unsigned int parent, lchild, rchild;
} HTNode, *HuffmanTree;void Select(HuffmanTree &HT, int n, int &s1, int &s2)
//在HT[1..n]中选择parent为0且weight最小的两个结点,
// 其序号分别为s1和s2。
{s1 = 0;//0单元不用s2 = 0;//找第一个for (int i = 1; i <= n; i++) {if (HT[i].parent == 0) {if (s1 == 0) s1 = i;//假设当前节点最小(初始)else if (HT[i].weight < HT[s1].weight)s1 = i;}}for (int i = 1; i <= n; i++) {//跳过s1找s2,如果找不到s2将=0if (HT[i].parent == 0&& i != s1) {if (s2 == 0)s2 = i;//假设当前节点最小(初始)if (HT[i].weight < HT[s2].weight )s2 = i;}}
}void createHuffmanTree(HuffmanTree &HT, int n) {if (n <= 1) return;int m = 2 * n - 1;//从权值节点数目推树的节点个数HT = new HTNode[m + 1];  // 0号单元未用,实际大小需+1for (int i = 0; i <= m; i++) { //初始化所有节点HT[i].weight = 0;HT[i].parent = 0;HT[i].lchild = 0;HT[i].rchild = 0;}for (int i = 1; i <= n; i++) { //输入权值节点(下标1到n)cin >> HT[i].weight;}for (int i = n + 1; i <= m; i++) {  // 即将合成的树放在i 一直往后退int s1, s2;Select(HT, i - 1, s1, s2);//在新树前(i前)选两颗权值最小的//新树生成HT[s1].parent = i;HT[s2].parent = i;HT[i].lchild = s1;HT[i].rchild = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;}
}typedef char **HuffmanCode;void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int n) {HC = new char*[n + 1];//二级指针,储存每个节点的编码char *tmp = new char[n];//每个节点逆推得到的编码临时储存(定长)tmp[n - 1] = '\0';// 编码结束符for (int i = 1; i <= n; i++) {// 逐个节点求哈夫曼编码,这里1-n的节点全为初始节点int start = n - 1;// 编码结束符位置(倒推用)//一直回溯int child = i, par = HT[i].parent;//子节点,双亲节点下标while(par != 0){if (HT[par].lchild == child) tmp[--start] = '0';//在父母的左边else tmp[--start] = '1';//在父母的右边child = par;par = HT[par].parent;}HC[i] = new char[n-start];// 为第i个字符编码分配空间,变长编码实现strcpy(HC[i], &tmp[start]);    //缩短}delete tmp;   //释放工作空间
} //HuffmanCodingint main() {int i, n;HuffmanTree HT;HuffmanCode HC;cin>>n;  //权值个数//创建哈夫曼树createHuffmanTree(HT, n);//获取编码HuffmanCoding(HT, HC, n);//输出哈夫曼编码for (i = 1; i < n + 1; i++)cout <<HC[i]<<endl;//释放delete HC;delete HT;
}//main

SCAU程序设计在线实训平台_实验_数据结构_实验4相关推荐

  1. SCAU程序设计在线实训平台_编程进阶_新生赛题目_2019年初出茅庐_开门,你的圣诞礼物

    开门,你的圣诞礼物(No.18598) 描述: 快要到圣诞节了,说到圣诞节首先让人想到圣诞老人和圣诞树. 实际上,圣诞节是为了庆祝耶稣的降生,但是这跟我们没有什么关系,有兴趣可以选修英语选修中讲述历史 ...

  2. SCAU程序设计在线实训平台_考试_计算智能_ 最小的特殊数字

    最小的特殊数字 描述 用全部N(N<=10)个0-9的数字组成一个"有效"整数(即没有前置0的整数), 求这些组成的数中能被K(0<K<10^10)整除的最小数字 ...

  3. 墨天轮数据库在线实训平台发布,这份操作指南助你快速上手

    你是否有过这样的烦恼? 数据库运行环境要求过高,难以实操: 数据库安装与配置过程繁琐,耽误时间: 单看PPT或视频的理论学习,太过枯燥: -- Don't worry!  墨天轮数据库在线实训平台V1 ...

  4. 数据库在线实训平台-MySQL篇

    引入:记一次MySQL在线平台的实训过程 写在前面的话:自程序员节重磅来袭,十大数据库掌门尖峰对话,顶级大咖再聚长沙,硬核科技+开源文化+大咖云集共话数字计算新时代 -- 长沙·中国1024程序员节 ...

  5. educoder实训平台python顺序结构答案_传智播客升级实训课程,打造高分项目实战网课助力高校在线实训...

    疫情期间,全国高校泛IT类计算机专业的实训课程由原先的线下实训临时转到线上教学,有些高校因对直播授课模式中控场.应变.学习过程反馈.以及学生吸收程度等经验不足,导致实训结果达不到学校最佳预期.为辅助全 ...

  6. 机器人操作系统(ROS)在线实训平台学习实验指南

    2019年更新:ROS 1.0(Kinetic)和ROS 2.0(Ardent)安装与测试 试用和学习机器人操作系统最便捷的打开方式 https://blog.csdn.net/ZhangRelay/ ...

  7. educoder实训平台python基础综合测试答案_智慧职教mooc2020Python程序设计基础章节测试答案...

    [判断题] 风口小套主要是受到渣铁与风口的直接接触而烧坏的.() [单选] 汽化冷却的冷却介质是(). [单选] 高炉煤气的燃点是()℃. [单选] 冷却设备破损后,关闭水源主要是为了(). [填空题 ...

  8. educoder实训平台python基础综合测试答案_云课堂-智慧职教Python编程基础答案第一章单元测试答案...

    [单选] 数据系统管理为什么要考虑备份恢复?() [单选] 共享的知识文档为什么需要做脱密处理?() [单选] 工具管理中的运维管理工具功能不包括(). [判断题] 学校.幼儿园.医院等以公益为目的的 ...

  9. 程序设计综合实训——高校教师信息管理系统(数据结构,单向链表)

    题目: 编写一套计算机学院教师信息管理系统,用菜单进行管理,具备输入.显示.查找.排序.插入等功能.每一条记录包括一位教师的职工号.姓名.职称.性别.2门主讲课程,包括课程名称.开课学期.课程性质(必 ...

最新文章

  1. 内存很空却频繁gc_NonRegisteringDriver造成的内存频繁FullGc
  2. MySQL MGR与Galera性能测试
  3. 将image存入mysql数据库_有谁知道如何把一图片存放到mysql数据库中
  4. 我们究竟还要学习哪些Android知识?看这一篇就够了!
  5. 宝塔面板 创建 二级域名 Unable to round-trip http request to upstream
  6. android 8.0 以后 uiautomator 无法直接使用的问题
  7. node mysql sequlize_玩转Node.js-Sequelize基础
  8. 时间选择器Android-PickerView的使用
  9. 计算机软件评估资料,软件项目工作量评估方法 计算机软件及应用 IT计算机 专业资料.doc...
  10. 5.1 Lilypond五线谱
  11. 【模电】0010 正弦波产生电路(RC正弦波振荡电路)
  12. 读后感之悟道-一位20年IT高管的职场心得
  13. win7使用痕迹清理方法【系统天地】
  14. if函数的语法c语言并列,逻辑函数IF的各种使用方法
  15. 明解C语言入门篇_第10章_指针
  16. 世界首个四足后空翻MIT机器猎豹踢足球,网友惊呼:终结者来了!
  17. 加餐0 | 前后端快速入门学习路线
  18. 无影云服务器没有网络怎么办?
  19. 切比雪夫不等式例题讲解_初中数学,一元一次不等式组应用题,2道例题讲解,配3道练习...
  20. Kubernetes上的有状态工作负载迎来转折点

热门文章

  1. 从CPU架构--x86架构和arm架构处理器--功耗
  2. 液压缸移动负载分析(液压系统基础)
  3. git 详解-进阶篇
  4. Wopus问答第一期
  5. QT笔记——Q_Q 和Q_D 学习
  6. 学习笔记(34):Python 面试100讲(基于Python3.x)-用正则表达式分别提取电话号的区号、电话号和分机号...
  7. 《与君对酒》 徐正坤
  8. 如果推动世界进步的是魔法,世界将会怎样?
  9. LaTeX 页面设置 插入代码
  10. 茜茜:大二开始布局学习大数据,结果如何?