数据结构——二叉树的递归算法

二叉树的结构定义:

typedef struct BiNode
{TElemType data;struct BiNode *lchild;struct BiNode *rchild;
}BiNode,*BiTree;

这里包含的递归算法有:

  1. 二叉树的先序创建;
  2. 二叉树的先序中序后序遍历;
  3. 二叉树的销毁算法;
  4. 双序遍历;
  5. 求结点的个数;
  6. 求结点值的和;
  7. 求树的深度;
  8. 求叶子结点的个数;
  9. 求单分支结点的个数;
  10. 交换结点的左右子树;
  11. 寻找最小值结点;
  12. 判断是否是相同的二叉树;
  13. 判断是否是平衡二叉树;
  14. 判断是对称二叉树;
  15. 二叉树的最小深度算法
    查看之前的博文
    二叉树的最小深度
  16. 二叉树的层次遍历
    查看之前的博文
    二叉树的层次遍历
    二叉树的层次遍历进阶
  17. 二叉树的最长路径
    查看之前的博文
    二叉树的最长路径问题
  18. 从叶子结点到根节点的全部路径
    查看之前的博文
    从叶子结点到根节点的全部路径

最底面有全部代码的合集:
1 二叉树的先序创建
思路:
和先序递归遍历差不多,二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表。(序列中元素为‘#’时,表示该结点为空)。

void CreateBiTree(BiTree &T)//二叉树的先序创建 
{TElemType ch;scanf("%c",&ch);if(ch=='#')T=NULL;else {T=(BiNode*)malloc(sizeof(BiNode));if(!T)exit(-1);T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
}

2二叉树的先序中序后序遍历
思路:
先序中序后序递归算法都类似


int  preorderTraverse(BiTree T)//二叉树的先序递归遍历算法 
{if(T==NULL)return 0;else {printf("%c ",T->data);preorderTraverse(T->lchild);preorderTraverse(T->rchild);}} int  InorderTraverse(BiTree T)//二叉树的中序递归遍历算法 
{if(T==NULL)return 0;else {InorderTraverse(T->lchild);printf("%c ",T->data);InorderTraverse(T->rchild);}}int  PostorderTraverse(BiTree T)//二叉树的后序递归遍历算法 
{if(T==NULL)return 0;else {PostorderTraverse(T->lchild);PostorderTraverse(T->rchild);printf("%c ",T->data);}}

3二叉树的销毁算法
思路:
和后序递归算法类似

void DestroyBiTree(BiTree &T)//二叉树的销毁算法 
{if(T==NULL)exit(-1);else{DestroyBiTree(T->lchild);DestroyBiTree(T->rchild);free(T);}
}

4双序遍历
思路:和普通前序中序遍历类似

void double_preorderTraverse(BiTree T)//双序遍历 
{if(T!=NULL){printf("%c ",T->data);double_preorderTraverse(T->lchild);printf("%c ",T->data);double_preorderTraverse(T->rchild);}
}

5求结点的个数
思路:仅一个if else

int NodeCount(BiTree &T)//求节点的个数 
{if(T==NULL)return 0;elsereturn 1+NodeCount(T->lchild)+NodeCount(T->rchild);
}

6求结点值的和
思路:
和求结点个数一样的算法

int Sum(BiTree &T)//求结点值的和 
{if(T==NULL)return 0;elsereturn T->data+Sum(T->lchild)+Sum(T->rchild);
}

7求树的深度
思路:
树的深度是指树的最大深度(根节点到最远叶子结点的层次)
在这里插入图片描述

int max(int x,int y)//求两数的最大值 
{if(x>y)return x;elsereturn y;	
}int BiTree_height1(BiTree &T)//求树的深度算法1 
{if(T==NULL)return 0;elsereturn 1+max(BiTree_height1(T->lchild),BiTree_height1(T->rchild));} 

int BiTree_height2(BiTree &T)//求树的深度算法2 
{int l_height,r_height;if(T==NULL)return 0;else{l_height=BiTree_height2(T->lchild);r_height=BiTree_height2(T->rchild);return (l_height>r_height)?(l_height+1):(r_height+1);}}

8求叶子结点的个数
思路:
若T为空,则返回0;
若T为叶子结点,则返回1;
若为非叶子结点,则返回(左子树叶子结点数+右子树叶子结点数);

在这里插入图片描述

int leafCount(BiTree &T)//求叶子结点的个数 
{if(T==NULL)return 0;if(T->lchild==NULL&&T->rchild==NULL)return 1;else{return leafCount(T->lchild)+leafCount(T->rchild);}} 

9求单分支结点的个数
思路:

int DegreeOne(BiTree T)
{if(NULL == T)return 0;if(NULL == T->lchild && NULL == T->rchild)//为叶子结点 return 0;if(NULL != T->lchild && NULL != T->rchild)//为双分支结点 return DegreeOne(T->lchild) + DegreeOne(T->rchild);//此时为单分支结点 return 1 + DegreeOne(T->lchild) + DegreeOne(T->rchild);}
int DegreeOne1(BiTree &T)//求单分支节点的个数 算法2
{int lnum, rnum, n;if(T == NULL)return 0;else{if((T->lchild == NULL && T->rchild != NULL) ||(T->lchild != NULL && T->rchild == NULL))n = 1; //为单分支结点elsen = 0; //其他结点lnum = DegreeOne1(T->lchild); //递归求左子树中单分支结点数rnum = DegreeOne1(T->rchild); //递归求右子树中单分支结点数return (lnum + rnum + n);}}

10交换结点的左右子树
另一个单独的问题的博文
数据结构——二叉树交换左右子树
代码:

void Exchange_lchild_rchild(BiTree &T)//½»»»×óÓÒº¢×Ó½áµã 
{if(T!=NULL)	if(T->lchild!=NULL||T->rchild!=NULL){BiTree temp;temp=T->lchild;T->lchild=T->rchild;T->rchild=temp;Exchange_lchild_rchild(T->lchild);Exchange_lchild_rchild(T->rchild);}}

11寻找最小值结点
代码:

void Findminnode(BiTree &T,char &min)//Ñ°ÕÒ×îСֵ½áµã 
{if(T!=NULL){if(T->data<min){min=T->data;}Findminnode(T->lchild,min);Findminnode(T->rchild,min);}

12判断是否是相同的二叉树

思路:
1判断这两棵树是否都空,如果都空,则是相同的树,如果有一棵树不空另一棵树为空,则不是相同的树
2这两棵树都不空,判断这个节点对应的值相等吗?
3若这两个节点的值相等,递归同时判断这两棵树的左子树,右子树。

status BiTree_is_same(BiTree &T,BiTree &S)//ÊÇ·ñÊÇÏàͬµÄ¶þ²æÊ÷ 
{if(T==NULL&&S==NULL)return 1;if(T==NULL||S==NULL)return 0;if(T->data!=S->data)return 0;return(BiTree_is_same(T->lchild,S->lchild)&&BiTree_is_same(T->rchild,S->rchild));
}

13判断是否是平衡二叉树
思路:
1如果这颗树为空,则返回1
2此时(这棵树不为空),判断该节点的左右子树的高度差的绝对值|(左子树的高度—右子树的高度)|>1,如果大于1,则返回0
3此时(该节点的左右子树的高度差<1),递归遍历该节点的左右子树。


int BiTree_height1(BiTree &T)//ÇóÊ÷µÄÉî¶ÈËã·¨1 
{if(T==NULL)return 0;elsereturn 1+max(BiTree_height1(T->lchild),BiTree_height1(T->rchild));} status BiTree_is_Balanced(BiTree T)//ÅжÏÊÇ·ñÊÇƽºâ¶þ²æÊ÷ 
{if(T==NULL)return 1;if(abs(BiTree_height1(T->lchild)-BiTree_height1(T->rchild))>1)return 0;return BiTree_is_Balanced(T->lchild)&&BiTree_is_Balanced(T->rchild);
}

14判断是对称二叉树
思路:
1用BiTree_symmetry(BiTree T)函数调用T的左右子树
2调用 BiTree_check(BiTree root1,BiTree root2)函数核实他的左右子树是否满足左右对称,镜像:如果左右子树都空则返回1,若果仅有一棵树为空,则返回0,若两棵树都不空,则返回(判断左右子树对应根节点的值是否相等,递归调用BiTree_check(BiTree root1,BiTree root2)判断该节点的左右子树)BiTree_check(root1->lchild,root2->rchild)&&BiTree_check(root1->rchild,root2->lchild)

status BiTree_check(BiTree root1,BiTree root2)
{if(root1==NULL&&root2==NULL) return 1;if(root1==NULL||root2==NULL) return 0;return root1->data==root2->data&&BiTree_check(root1->lchild,root2->rchild)&&BiTree_check(root1->rchild,root2->lchild);
}status BiTree_symmetry(BiTree T)//
{return BiTree_check(T->lchild,T->rchild);} 

全部代码(可执行)

#include<stdio.h>
#include<bits/stdc++.h> 
typedef char TElemType;
typedef int status; 
typedef struct BiNode
{TElemType data;struct BiNode *lchild;struct BiNode *rchild;
}BiNode,*BiTree;
void CreateBiTree(BiTree &T)//¶þ²æÊ÷µÄÏÈÐò´´½¨ 
{TElemType ch;scanf("%c",&ch);if(ch=='#')T=NULL;else {T=(BiNode*)malloc(sizeof(BiNode));if(!T)exit(-1);T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
}
void CreateBiTree2(BiTree &T)//¶þ²æÊ÷µÄÖÐÐò´´½¨ 
{TElemType ch;scanf("%c",&ch);if(ch=='#')T=NULL;else {T=(BiNode*)malloc(sizeof(BiNode));if(!T)exit(-1);CreateBiTree(T->lchild);T->data=ch;CreateBiTree(T->rchild);}
}
void DestroyBiTree(BiTree &T)//¶þ²æÊ÷µÄÏú»ÙËã·¨ 
{if(T==NULL)exit(-1);else{DestroyBiTree(T->lchild);DestroyBiTree(T->rchild);free(T);}
}void double_preorderTraverse(BiTree T)//Ë«Ðò±éÀú 
{if(T!=NULL){printf("%c ",T->data);double_preorderTraverse(T->lchild);printf("%c ",T->data);double_preorderTraverse(T->rchild);}
}int  preorderTraverse(BiTree T)//¶þ²æÊ÷µÄÏÈÐòµÝ¹é±éÀúËã·¨ 
{if(T==NULL)return 0;else {printf("%c ",T->data);preorderTraverse(T->lchild);preorderTraverse(T->rchild);}} int  InorderTraverse(BiTree T)//¶þ²æÊ÷µÄÖÐÐòµÝ¹é±éÀúËã·¨ 
{if(T==NULL)return 0;else {InorderTraverse(T->lchild);printf("%c ",T->data);InorderTraverse(T->rchild);}}int  PostorderTraverse(BiTree T)//¶þ²æÊ÷µÄºóÐòµÝ¹é±éÀúËã·¨ 
{if(T==NULL)return 0;else {PostorderTraverse(T->lchild);PostorderTraverse(T->rchild);printf("%c ",T->data);}}int NodeCount(BiTree &T)//Çó½ÚµãµÄ¸öÊý 
{if(T==NULL)return 0;elsereturn 1+NodeCount(T->lchild)+NodeCount(T->rchild);
}int Sum(BiTree &T)//Çó½áµãÖµµÄºÍ 
{if(T==NULL)return 0;elsereturn T->data+Sum(T->lchild)+Sum(T->rchild);
}int max(int x,int y)//ÇóÁ½ÊýµÄ×î´óÖµ 
{if(x>y)return x;elsereturn y;	
}int BiTree_height1(BiTree &T)//ÇóÊ÷µÄÉî¶ÈËã·¨1 
{if(T==NULL)return 0;elsereturn 1+max(BiTree_height1(T->lchild),BiTree_height1(T->rchild));} int BiTree_height2(BiTree &T)//ÇóÊ÷µÄÉî¶ÈËã·¨2 
{int l_height,r_height;if(T==NULL)return 0;else{l_height=BiTree_height2(T->lchild);r_height=BiTree_height2(T->rchild);return 1+max(l_height,r_height);}}int leafCount(BiTree &T)//ÇóÒ¶×Ó½áµãµÄ¸öÊý 
{if(T==NULL)return 0;if(T->lchild==NULL&&T->rchild==NULL)return 1;else{return leafCount(T->lchild)+leafCount(T->rchild);}} void Exchange_lchild_rchild(BiTree &T)//½»»»×óÓÒº¢×Ó½áµã 
{if(T!=NULL)	if(T->lchild!=NULL||T->rchild!=NULL){BiTree temp;temp=T->lchild;T->lchild=T->rchild;T->rchild=temp;Exchange_lchild_rchild(T->lchild);Exchange_lchild_rchild(T->rchild);}} void Findminnode(BiTree &T,char &min)//Ñ°ÕÒ×îСֵ½áµã 
{if(T!=NULL){if(T->data<min){min=T->data;}Findminnode(T->lchild,min);Findminnode(T->rchild,min);}} int DegreeOne(BiTree T)
{if(NULL == T)return 0;if(NULL == T->lchild && NULL == T->rchild)//ΪҶ×Ó½áµã return 0;if(NULL != T->lchild && NULL != T->rchild)//Ϊ˫·ÖÖ§½áµã return DegreeOne(T->lchild) + DegreeOne(T->rchild);//´ËʱΪµ¥·ÖÖ§½áµã return 1 + DegreeOne(T->lchild) + DegreeOne(T->rchild);}
int DegreeOne1(BiTree &T)//Çóµ¥·ÖÖ§½ÚµãµÄ¸öÊý Ëã·¨2
{int lnum, rnum, n;if(T == NULL)return 0;else{if((T->lchild == NULL && T->rchild != NULL) ||(T->lchild != NULL && T->rchild == NULL))n = 1; //Ϊµ¥·ÖÖ§½áµãelsen = 0; //ÆäËû½áµãlnum = DegreeOne1(T->lchild); //µÝ¹éÇó×ó×ÓÊ÷Öе¥·ÖÖ§½áµãÊýrnum = DegreeOne1(T->rchild); //µÝ¹éÇóÓÒ×ÓÊ÷Öе¥·ÖÖ§½áµãÊýreturn (lnum + rnum + n);}}status BiTree_is_same(BiTree &T,BiTree &S)//ÊÇ·ñÊÇÏàͬµÄ¶þ²æÊ÷ 
{if(T==NULL&&S==NULL)return 1;if(T==NULL||S==NULL)return 0;if(T->data!=S->data)return 0;return(BiTree_is_same(T->lchild,S->lchild)&&BiTree_is_same(T->rchild,S->rchild));
}status BiTree_is_Balanced(BiTree T)//ÅжÏÊÇ·ñÊÇƽºâ¶þ²æÊ÷ 
{if(T==NULL)return 1;if(abs(BiTree_height1(T->lchild)-BiTree_height1(T->rchild))>1)return 0;return BiTree_is_Balanced(T->lchild)&&BiTree_is_Balanced(T->rchild);
}status BiTree_check(BiTree root1,BiTree root2)
{if(root1==NULL&&root2==NULL) return 1;if(root1==NULL||root2==NULL) return 0;return root1->data==root2->data&&BiTree_check(root1->lchild,root2->rchild)&&BiTree_check(root1->rchild,root2->lchild);
}status BiTree_symmetry(BiTree T)//¶Ô³Æ¶þ²æÊ÷ 
{return BiTree_check(T->lchild,T->rchild);} int main()
{	int x;int node_number,BiTree_height;BiTree T;char min;printf("´´½¨Ê÷ÊäÈëÊ÷TµÄÏÈÐòÐòÁÐ(ÆäÖÐʹÓÃ#´ú±í¿Õ½Úµã)\n");CreateBiTree(T);printf("---²Ëµ¥---\n"); printf("[1]:ÏÈÐò±éÀúËã·¨\n");printf("[2]:ÖÐÐò±éÀúËã·¨\n");printf("[3]:ºóÐò±éÀúËã·¨\n");printf("[4]:Çó½áµã¸öÊýËã·¨\n");printf("[5]:ÇóÊ÷µÄÉî¶ÈËã·¨\n");printf("[6]:½»»»×óÓÒº¢×Ó½ÚµãËã·¨\n");printf("[7]:Ñ°ÕÒ×îСֵ½áµãËã·¨\n"); printf("[8]:Çóµ¥·ÖÖ§½ÚµãµÄ¸öÊýËã·¨\n");printf("[9]ÅжÏÊÇ·ñÊÇÏàͬµÄÊ÷\n");printf("[10]:ÅжÏÊÇ·ñÊÇƽºâ¶þ²æÊ÷\n"); printf("[11]:ÅжÏÊÇ·ñÊǶԳƶþ²æÊ÷\n"); while(1){int n; printf("\nÊäÈëÒª½øÐеIJÙ×÷:");scanf("%d",&n);switch(n){case 1:preorderTraverse(T);break;case 2:InorderTraverse(T);break;case 3:PostorderTraverse(T);break;case 4:node_number=NodeCount(T);printf("%d",node_number);break;case 5:BiTree_height=BiTree_height1(T);printf("%d",BiTree_height);break;case 6:Exchange_lchild_rchild(T);break;case 7:min=T->data;Findminnode(T,min);//±ØÐëÔÚµ÷Óú¯ÊýÇ°¸³³õÖµ printf("%c",min);break;case 8:printf("Çóµ¥·ÖÖ§½áµã¸öÊý£º");printf("%d",DegreeOne1(T)); break;case 9:if(BiTree_is_same(T,T)) printf("ÊÇÏàͬµÄÊ÷\n");else printf("²»ÊÇÏàͬµÄÊ÷\n");break;		case 10:if(BiTree_is_Balanced(T)) printf("ÊÇƽºâ¶þ²æÊ÷\n");else printf("²»ÊÇƽºâ¶þ²æÊ÷\n");break; case 11:if(BiTree_symmetry(T)) printf("ÊǶԳƶþ²æÊ÷\n");else printf("²»ÊǶԳƶþ²æÊ÷\n");break;}} }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用BeetleX访问redis服务

BeetleX针对redis访问封了全async/await操作模式&#xff0c;通过它可以更高效地访问redis服务。BeetleX.Redis提供读写分离和多机故意写入处理&#xff0c;同时安全的TLS访问机制&#xff0c;在使用功能上组件支持绝大部分基础指令&#xff0c;并提供json&#xff0c;protobuf…

鸿蒙系统可以替代安卓吗,华为今天发布的鸿蒙系统,到底能不能替代安卓?

对于大部分差友们来说&#xff0c;“开发者大会”这个词一定显得陌生而又遥远&#xff0c;跟普通的产品发布会不一样&#xff0c;他们面向的对象并不是普通的消费者&#xff0c;而是各种程序猿和攻城狮。话又说回来&#xff0c;能开“ 开发者大会”&#xff0c;也说明这个企业已…

android loading封装_我们经常用的Loading动画居然还有这种姿势

背景Loading动画几乎每个Android App中都有。一般在需要用户等待的场景&#xff0c;显示一个Loading动画可以让用户知道App正在加载数据&#xff0c;而不是程序卡死&#xff0c;从而给用户较好的使用体验。同样的道理&#xff0c;当加载的数据为空时显示一个数据为空的视图、在…

数据结构——基于字符串模式匹配算法的病毒感染检测

实验四 基于字符串模式匹配算法的病毒感染检测 【实验目的】 1.掌握字符串的顺序存储表示方法。 2.掌握字符串模式匹配BF算法和KMP算法的实现。 【实验内容】 问题描述 医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的DNA序列都是环状的。现在研究者已收集了…

WPF 使用 Expression Design 画图导出及使用 Path 画图

WPF 使用 Expression Design 画图导出及使用 Path 画图目录WPF 使用 Expression Design 画图导出及使用 Path 画图一、软件介绍二、Microsoft Expression Design 使用三、微语言和 Path 绘图1、"注释" 图形&#xff08;中括号&#xff09;2、"并行模式" 图…

数据结构——模式匹配kmp算法

暴力算法 //暴力算法 int index(SString S,SString T,int pos) {int ipos,j1;while(i<S[0]&&j<T[0]){if(S[i]T[j]){i;j;}else {ii-j2;j1;}}if(j>T[0])return i-T[0];else return 0;} kmp算法 next[]数组的求法&#xff1a; 例子&#xff1a;abaabcac 模式串…

互联网时代供应链

供应链是指围绕核心企业&#xff0c;从配套零件开始&#xff0c;制成中间产品以及最终产品&#xff0c;最后由销售网络把产品送到消费者手中的、将供应商&#xff0c;制造商&#xff0c;分销商直到最终用户连成一个整体的功能网链结构。供应链管理的经营理念是从消费者的角度&a…

win7 计算器 android,教你巧妙应用Win7计算器和时钟

正文最新的Win7是一种个性化设计极强的操作系统&#xff0c;在许多细节方面都做到了人性化设计。其功能的DIY性非常明显&#xff0c;是XP系统远远不能比的。今天我们要说的是Win7计算器和时钟&#xff0c;除了可以计算和时间之外我们还可以让他们有哪些妙用呢&#xff1f;我们左…

真实经历:整整一年了,他是这样从程序员转型做产品经理的

这是头哥侃码的第224篇原创每年年底&#xff0c;有不少企业都会对一年内辛勤劳作的员工量身定做一些奖项。发个奖杯&#xff0c;给点奖金&#xff0c;让那些没得奖的人看看&#xff0c;咱们公司有多么的关注员工的闪光点&#xff0c;优秀之处。用人所长&#xff0c;容人所短&am…

数据结构—— 基于二叉树的算术表达式求值

实验五 基于二叉树的算术表达式求值 数据结构——中序表达式求值&#xff08;栈实现&#xff09; 实验目的&#xff1a; 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法。 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于表达式树的表达式求值算法。 实验内容&a…

数字标牌 android,【浩鑫推出全球首款英特尔方案+Android系统数字标牌播放器】PjTime.COM 新品快讯 Intel...

世界知名迷你准系统领导品牌&#xff0d;浩鑫Shuttle&#xff0c;秉承开拓创新&#xff0c;引领行业发展的传统&#xff0c;此次创造性的推出全球首款采用英特尔硬件方案搭载Android系统的NS01A数字标牌播放器&#xff0c;为整个数字标牌行业贡献了全新的硬件解决方案。英特尔方…

BCVP开发者说第3期:Adnc

沉静岁月&#xff0c;淡忘流年1项目简介AdncAdnc是一个轻量级的.NetCore微服务快速开发框架&#xff0c;同时也可以应用于单体架构系统的开发。框架基于JWT认证授权、集成了一系列微服务配套组件&#xff0c;代码简洁、易上手、学习成本低、开箱即用。    框架前端基于Vue、…

数据结构——二叉树的非递归算法

二叉树的非递归算法 先序遍历非递归算法1 先序遍历非递归算法2 非递归交换左右孩子算法 使用栈来实现二叉树的非递归算法 栈的基本算法 #include<stdio.h> #include<bits/stdc.h> typedef int Status; #define OK 1 #define ERROR 0 #define TRUE 1 #define …

python字符串的表示_Python字符串方法总结

Python字符串方法图示&#xff1a; &#xff08;温馨提示&#xff1a;对图片点右键——在新标签页中打开图片&#xff09;1、index() 定义&#xff1a;查找并返回指定str的索引位置&#xff0c;如果没找到则会抛异常&#xff08;查找的顺序是从左至右&#xff09;可以指定范围&…

Kuma 1.0 GA发布,70多项新功能和改进

喜欢就关注我们吧&#xff01;Kuma 1.0 GA 现已发布&#xff0c;包含了 70 多种新功能和改进。Kuma 是一个现代的通用服务网格控制平面&#xff0c;基于 Envoy 搭建&#xff0c;Envoy 是一个为云原生应用设计的强大的代理软件。Kuma 高效的数据平面和先进的控制平面&#xff0c…

还在犹豫是否迁移.NET5?这几个项目已经上线了!

.NET5正式发布有十多天&#xff0c;博客园、知乎、技术群都讨论的非常热烈。关于项目是否迁移.NET5的话题讨论的尤为热烈&#xff0c;作为.NET十年老司机要告诉你&#xff0c;.NET5的迁移势在必行&#xff0c;当下就是最好的时机&#xff01;犹豫项目是否升级到.NET5的&#xf…

Android切换泰语,Android应用内切换语言

首先扯点别的&#xff1a;这是第一次在简书上写东西&#xff0c;我突然明白为啥这么多人在简书上写东西了&#xff0c;因为没有广告啊&#xff0c;哈哈。最近接触到Android 应用内切换语言的问题&#xff0c;研究了两天&#xff0c;做个记录先。实现了中文&#xff0c;英文&…

工程勘察设计收费标准2002修订版_黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计招标...

黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计第一标段招标公告招标编号&#xff1a;JTZGSJ20200011.招标条件本招标项目黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计已由上级部门批准建设&#xff0c;项目业主为哈尔滨交通集团有限公司&#xff0c;建设资金来…

从 3.1 到 5.0 —— OpenReservation 更新记

OpenReservation 从 asp.net core 3.1 到 5.0IntroOpenReservation 是一个开源的预约系统&#xff0c;最初的版本是我们学校的活动室预约系统&#xff0c;现在正逐步变成一个更为通用的预约系统。.NET5 发布之后也是把这个项目更新到了 5.0。这个项目是一个做了很长时间的项目&…

数据结构——哈弗曼编码问题

实验六 基于哈夫曼树的数据压缩算法 【实验目的】 掌握哈夫曼树的构造算法。掌握哈夫曼编码的构造算法。 【实验内容】 问题描述 输入一串字符,根据给定的字符串中字符出现的频率建立相应的哈夫曼树, 构造哈夫曼编码表,在此基础上可以对压缩文件进行压缩(即编码),同时可以对 压…