【数据结构·考研】判断满二叉树

判断一棵二叉树是不是满二叉树除最后一层无任何孩子外,每一层上的所有结点都有左右孩子的二叉树叫做满二叉树。判断一棵二叉树是不是满二叉树,首先是递归的方法:空树是满二叉树,非空的树当且仅当它的左右子树都是满二叉树的时候,它就是一棵满二叉树。每个子树应当满足:① 同时存在左子树和右子树;② 左右子树高度相同。/*每个节点都存在左右孩子并且左右子树深度相同时是满二叉树*/ int Height(Tree& t){ if(t == NULL) return 0; return He
分类: 其他 发布时间: 09-14 23:28 阅读次数: 0

【数据结构·考研】判断完全二叉树

判断一棵二叉树是不是完全二叉树一棵二叉树,除最后一层外,是一棵满二叉树,最后一层可以不满,但是必须从左往右连续的有。完全二叉树的不对称性决定了判断是不是一棵二叉树是不是完全二叉树最好要用非递归广度优先遍历。在一般的广度优先遍历中,出队一个结点后检查是否有左右孩子,有的话相应孩子进队。在这道题中,无论有没有左右孩子都进队,得到第一个NULL结点时判断队列里有没有非空结点,有的话它就不是一棵完全二叉树。代码如下:#include<iostream>#include<
分类: 其他 发布时间: 09-14 23:28 阅读次数: 0

【数据结构·考研】相似的二叉树 & 相同的二叉树

相似的树如果两棵二叉树在结构上相同,则认为它们是相似的。这道题用递归的方式来做最简单,递归的遍历两棵二叉树相同的位置。两棵二叉树 t1 和 t2 皆为空或者皆不空且 t1 的左右子树和 t2 的左右子树分别相似,则可以判断出 t1 和 t2 相似。//相似的树bool isSimilarTree(Tree& t1,Tree& t2){ if(t1 == NULL && t2 == NULL) return true; if(!(t1 &&
分类: 其他 发布时间: 09-14 23:27 阅读次数: 0

【数据结构·考研】交换二叉树的左右子树

交换二叉树的左右子树采用递归算法实现,想要交换 t 的左右子树,首先交换 t 的左子树的左右子树,再交换 t 的右子树的左右子树,最后交换 t 的左右子树,结点为空是边界条件。总的运行情况就是先遍历到树的边缘,然后从下往上交换,直至整棵树的左右子树都被交换。void swap(Tree& t){ if(t == NULL) return; //空结点返回上一层 swap(t->left); //实现左子树的交换 swap(t->right); //实现右子树的交换
分类: 其他 发布时间: 09-14 23:27 阅读次数: 0

【数据结构·考研】判断二叉搜索树

判断一棵二叉树是不是二叉搜索树对一棵二叉树进行中序遍历可以得到一个递增序列,基于这个思想,我们可以写出递归和非递归的代码,它们都是基于二叉树的中序遍历。递归版本://递归/*中序遍历*/ int last = INT_MIN; //pre保存当前结点中序前趋的值 bool isValidBST(Tree& t){ if(t == NULL) return true; if(isValidBST(t->left)){ //检查左子树 if(last < t-
分类: 其他 发布时间: 09-14 23:27 阅读次数: 0

【数据结构·考研】判断平衡二叉树

判断一棵树是不是平衡二叉树一棵树是平衡二叉树,当且仅当它的左右子树皆是平衡二叉树并且左右子树高度差小于绝对值 1 。判断的方式和判断满二叉树的方式很相似。完整代码如下:#include<iostream>#include<algorithm>using namespace std;typedef struct node{ char val; struct node* left; struct node* right;}TreeNode,*Tree;
分类: 其他 发布时间: 09-14 23:27 阅读次数: 0

【数据结构·考研】二叉树的最小深度

二叉树的最小深度最小深度是从根节点到最近叶子节点的最短路径上的节点数量。递归的遍历左右子树,如果走到一个叶子结点,返回 0 ,比较叶子结点父亲的左右子树高度,返回较小的一棵高度 +1。以后直接返回高度 + 1。代码如下:#include<iostream>#include<algorithm>using namespace std;typedef struct node{ char val; struct node* left; struct node
分类: 其他 发布时间: 09-14 23:26 阅读次数: 0

【数据结构·考研】树的孩子兄弟表示法

树的孩子兄弟表示法也叫树的二叉树表示法。树的左指针指向自己的第一个孩子,右指针指向与自己相邻的兄弟。结构的最大优点是:它和二叉树的二叉链表表示完全一样。可利用二叉树的算法来实现对树的操作 。左孩子右兄弟表示的树的高度因为二叉树表示法的根节点没有右孩子,所以树高就是左子树树高 + 1。然后我们看下根节点第一个孩子的高度,由于第一个孩子的右子树和第一个孩子的高度是相同的,所以比较左子树 + 1的高度来和右子树来比较,如果 左子树 + 1 > 右子树,高度取左子树 + 1,否则取右.
分类: 其他 发布时间: 09-14 23:26 阅读次数: 0

【数据结构·考研】二叉搜索树的插入与删除

建立一棵二叉搜索树二叉搜索树的巨大优势就是:在平均情况下,能够在 O(logN) 的时间内完成搜索和插入元素。递归版本://插入值为key的结点(递归) TreeNode* insertIntoBST(Tree& t, int key) { if(t == NULL){ //找到插入目标 t = new TreeNode; t->val = key; return t; } if(key > t->
分类: 其他 发布时间: 09-14 23:26 阅读次数: 0

【数据结构·考研】并查集

并查集并查集用来判断一个图中的两个点是否连通,通过标记确定该成员所在的团队,每个团队都有自己的领头羊。我们给每个成员赋初值为 -1 ,那么下标对应值为 -1 的即为这个团队的领头羊。vector<int> parent(6,-1);每个团队都有自己的代理人,如何找到它呢?顺着这个成员往它的上级找,找到标记为 -1 的成员,就抓住了领头羊。//查询操作 int getFather(int x){ return parent[x] == -1 ? x : getFathe
分类: 其他 发布时间: 09-14 23:26 阅读次数: 0

【数据结构·考研】中序线索二叉树

中序线索二叉树在 n 个结点的二叉链表中,有(n+1)个空指针域,利用这些空指针域来存放当前结点的直接前驱和后继的线索,可以加快查找速度。普通二叉树只能找到结点的左右孩子信息,而结点的直接前驱和直接后继只能在遍历中获得,若将遍历后对应的前驱和后继预存起来,从第一个结点开始就可以顺藤摸瓜而遍历整棵树,树实际变成了线性序列。例如中序遍历的结果实际上就是把二叉树转化成了线性排列。线索二叉树的结构声明typedef struct node{ struct node* left; int l
分类: 其他 发布时间: 09-14 23:25 阅读次数: 0

【数据结构·考研】图的深搜和广搜

深搜和广搜 - 邻接矩阵实现今天演示 dfs 和 bfs 的就是下边这个图。邻接矩阵的结构声明typedef struct{ int numVertices; //顶点个数 char vertice[10]; //顶点矩阵 int edge[10][10]; //边矩阵}MGraph; 与顶点 v 相邻的第一个结点的下标int fistNeighbor(MGraph& G,int v){ for(int i = 0;i < G.numVertices;i
分类: 其他 发布时间: 09-14 23:25 阅读次数: 0

【数据结构·考研】拓扑排序

拓扑排序先发一部分,一个邻接表用广度优先遍历实现的拓扑排序。#include<iostream>#include<queue>#include<stack>using namespace std;//边结点struct edgeNode{ int dest; //数字下标 edgeNode *next = NULL; }; //顶点结点 struct vertexNode{ char dest; //字母下标 edgeNode *f
分类: 其他 发布时间: 09-14 23:25 阅读次数: 0

【数据结构·考研】二分查找

二分查找适用于有序的顺序表,时间复杂度为对数级别。非递归实现://非递归 int BinarySearch(int* arr,int len,int key){ //数组、数组长度、关键字 int left = 0; int right = len - 1; while(left <= right){ int mid = (left + right)/2; if(arr[mid] == key) return mid; else if(arr[mid] > key
分类: 其他 发布时间: 09-14 23:25 阅读次数: 0

【数据结构·考研】直接插入排序和二分插入排序

直接插入排序//直接插入排序 void InsertSort(int* arr,int len){ for(int i = 1;i < len;i ++){ //比较len-1趟 if(arr[i] < arr[i-1]){ //找到一个不符合队伍特征的元素 //把它的值交给temp int temp = arr[i]; arr[i] = arr[i-1]; //从后向前比较 int j; for(j = i - 1;j >
分类: 其他 发布时间: 09-14 23:24 阅读次数: 0

【数据结构·考研】希尔插入排序

希尔插入排序//希尔排序void ShellSort(int* arr,int len){ int gap = len/2; //gap初始化为数组长度的一半 while(gap != 0){ //循环直到gap为0 //对每一个元素都进行直接插入排序,比较的间隔由gap决定 for(int i = gap;i < len;i++){ int temp = arr[i]; int j; for(j = i;j-gap >= 0;j =
分类: 其他 发布时间: 09-14 23:24 阅读次数: 0

(Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八

默认redis使用的是db 0,而我们自己在配置连接的时候可以设置默认使用db ,如:那么怎么去实现动态去切换自己想使用的db呢?先回顾性我们在配置redis的时候,连接redis使用的代码段(举例StirngRedisTemplate):那么切换也是同理,就是传入factory的时候,设置好选择的db:新建RedisDBChangeUtil.java:import org.springframework.beans.factory.annotation.Autowired..
分类: 其他 发布时间: 09-14 23:24 阅读次数: 0

JAVA jdk1.8 HashMap 存值流程图解

JCccc
分类: 其他 发布时间: 09-14 23:24 阅读次数: 0

Java String 为什么不可变? 真的吗?

众所周知:Stirng是个不可变的类,因为使用了final来修饰,如:又有一个众所周知:就是 String的本质是一个char[] 数组。所以为了确保String真的不可变,那么本质肯定不能变,于是乎这个char[]数组,如:看到这里,其实可以知道的就是,如果这个value数组的元素被改变了,那么String就是被改变了。所以在String的源码里,诸多方法里面都没有涉及到直接去修改value[]的元素。再度聚焦:这个构造函数,一眼能看明白意思,就是通..
分类: 其他 发布时间: 09-14 23:23 阅读次数: 0

JAVA 将日期字符串 月份不足10月进行补0操作

传过来的参数时间格式是:2020-9-2811:22:33我们需要将其变成:2020-09-2811:22:33使用DateTimeFormatter public static String getTransTime(String timeStr) { DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-M-dd HH:mm:ss"); LocalDate...
分类: 其他 发布时间: 09-14 23:23 阅读次数: 0