C语言最终文章-二叉树

文章目录

  • 前言
  • 二叉树的性质
  • 二叉树的存储方式
    • 顺序存储
      • 堆及其应用
      • TopK问题
      • 堆排序
    • 链式存储
      • 二叉树的练习
        • 1.二叉树查找值为x的节点
        • 2.判断是否为完全二叉树
        • LC226.翻转二叉树
        • [LC572. 另一棵树的子树](https://leetcode.cn/problems/subtree-of-another-tree/description/)
        • 两道选择题
  • 结言

前言

  • 这篇文章大概就是我C语言学习的最后一篇文章了。

本篇文章主要内容:

  • 二叉树的几个性质,堆、堆排序和用堆实现TopK问题。
  • 向上建堆和向下建堆
  • 二叉树的练习

二叉树原图:

在这里插入图片描述

二叉树的性质

开始讲二叉树时,我们先来学一下二叉树的重要性质。

1.对于任意二叉树: n 0 = n 2 + 1 n0 = n2+1 n0=n2+1 (其中 n0代表度为0的个数,n2代表度为2的节点个数)
2. N − 1 = n 0 ∗ 0 + n 1 ∗ 1 + n 2 ∗ 2 + . . . . N-1 =n0*0+n1*1+n2*2+.... N1=n00+n11+n22+.... (N-1代表边的个数)
3. 对于满二叉树来说,二叉树节点个数 = 2 h − 1 2^h-1 2h1 (h为二叉树的高度)

先来看第一条 n 0 = = n 2 + 1 ? n0 ==n2+1? n0==n2+1

来让我们想一想二叉树是如何构建的呢?

首先我们要明白一件事: 首先我们要明白一件事: 首先我们要明白一件事: 度为1的是有度为0的节点增加一个分支得来的,度为2的是由度为1的节点增加一个分支得来的。

一开始我们只有一个根节点,那么我们的 n 0 = 1 n0=1 n0=1,当我们增加一个度为1的

节点时,那么此时我们的 n 0 还是 = 0 , n 1 = 1 n0还是 = 0,n1=1 n0还是=0n1=1,当我们增加一个度为2的时候
n 0 − > 2 , n 1 − > 0 , n 2 − > 1 n0->2,n1->0,n2->1 n0>2n1>0n2>1

过程如下图:
在这里插入图片描述
那我们不难发现,我们的 n 0 = n 2 + 1 n0=n2+1 n0=n2+1 这个条件始终成立,只要我们增加一个度为2的节点,那么n0肯定会增加一个。

再来看第二条,对与一棵树而言,子数肯定也是一棵树,两个兄弟节点之间也
不会有连线。那么 N 个节点就可以形成 N-1 条边。而 n0 有有0条边,n1有1条边…,那么总的边数 N-1 就可以得出来第二条的公式。

第三条

- 对于一个满二叉树来说
在这里插入图片描述

  • 第一层节点个数: 2 0 2^0 20
  • 第二层节点个数: 2 1 2^1 21
  • 第三层节点个数: 2 2 2^2 22
  • 第四层节点个数: 2 3 2^3 23

那么如果一个h层的满二叉树它的节点总数 T(N) = 2 0 + 2 1 + 2 2 + . . . + 2 h − 1 2^0+2^1+2^2+...+2^{h-1} 20+21+22+...+2h1

所以 T ( N ) = 2 h − 1 T(N) = 2^{h}-1 T(N)=2h1

二叉树的存储方式

顺序存储

顺序存储本质上就是用数组存。这里我们理解一下完全二叉树和满二叉树

  • 满二叉树:各层的节点都是满的状态-就如上面那个图一样如上图
  • 完全二叉树:前 h-1层都是满的,第h层从右向左连续去掉节点。这就相当于,在最后一层它的节点必须是连续的。
    在这里插入图片描述
    理解完这两个概念之后,如果我们把这些二叉树的节点都放入数组中会怎么样呢? 如图:
    在这里插入图片描述
    当我们把树的节点都放入数组中后,我们发现双亲节点和它的左孩子和右孩子之间存在这么一个关系。
  • l c h i l d i = 2 ∗ p a r e n t i + 1 , r c h i l d i = 2 ∗ p a r e n t i + 2 lchild_i = 2*parent_i+1,rchild_i = 2*parent_i+2 lchildi=2parenti+1rchildi=2parenti+2
  • p a r e n t i = ( ( l , r ) c h i l d i − 1 ) / 2 parent_{i} = ((l,r)child_i-1)/2 parenti=((l,r)childi1)/2

注意: 这个规则只对完全二叉树和满二叉树使用,当然其他的二叉树我们也可以这么存储,只不过途中我们要把位置空出来,这样比较浪费空间,所以我们会使用下面的链式存储。

堆及其应用

当我们对顺序存储有了以上的了解后,我们就可以来实现堆了。注意这里的堆跟操作系统的堆可不一样,我们这里只是一个数据结构。

堆的操作:

  • 入堆
  • 出堆顶元素
  • 取堆顶元素
  • 判空

堆可以用来做什么呢?
比如:排出中国最有钱的前10个人,堆排序等等。

这里先介绍两个概念:

  • 大堆:堆顶元素比其他元素大
  • 小堆:堆顶元素比其他元素小

为什么要有这两个堆呢?

同时注意:大堆和小堆并不意味着有序。

如下图:大堆和小堆,只能说明堆顶元素,一定比其他元素大,由于二叉树左子树和右子树是两个子树。子树和树具有相同的性质

  • 对于大堆而言: 左子树也是大堆,右子树也是大堆,那么左子树的左子树也是大堆…
    在这里插入图片描述
    如果你要排升序的话,利用堆排大堆还是小堆呢呢?

如果排小堆,那么每次堆顶就是我们的最小元素,但是然后怎么排呢?这样剩
下的元素就不一定是小堆了。所以当我们排升序的时候我们排大堆,直接把堆顶元素与最后一个位置的元素交换,注意这时我们下面的子树并没有受影响,所以我们直接再排一次大堆就可以了。然后不断的排,数组就有序了。

下面我们都以建大堆为例:

先来说入堆

入堆的话,我们需要用到向上调整算法

算法演示如下:
在这里插入图片描述
当我们插入一个新元素后,不断地去找双亲节点判断大小,如果比双亲的值大

那么就交换,否则就不交换。

代码:

void ADjustUp(HpDataType* a, int n)
{int child = n - 1;int parent = (n - 1 - 1) / 2;while (parent >= 0){if (a[child] > a[parent]) //大的往上调{swap(&a[parent], &a[child]);child = parent;parent = (child - 1) / 2;}elsebreak;}
}
void HpPush(Hp* hp, HpDataType x)
{assert(hp);check_capacity(hp); //检查容量hp->a[hp->size] = x;hp->size++;ADjustUp(hp->a,hp->size); // 开区间
}

出堆顶元素

这里我们就要用到 向下调整算法:,由于我们必须保证树是一个大堆,所以每次把堆顶元素Pop调后,要保证树还是一个大堆。

这里我们直接把堆顶 a[0] 与 最后一个元素交换。我们本质上还是数组。
然后再用一次向下调整算法即可。

向下调整算法过程如图:
在这里插入图片描述
代码:

void AdjustDown(HpDataType* a, int begin, int end)
{int parent = begin;int child = 2 * parent + 1;while (child < end){if (child + 1 < end && a[child] > a[child + 1]){child += 1;}if (a[parent] > a[child]){swap(&a[parent], &a[child]);parent = child;child = 2 * parent + 1;}elsebreak;}
}
//出堆
void HpPop(Hp* hp)
{assert(hp && hp->size > 0);swap(&hp->a[0],&hp->a[hp->size-1]);//此时这个位置就不能才排了hp->size--;AdjustDown(hp->a,0,hp->size); }

堆的总代码:

typedef int HpDataType;
typedef struct Heap
{HpDataType* a;int size;int capacity;
}Hp;//初始化堆
void HpInit(Hp* hp);
//销毁堆
void HpDestory(Hp* hp);
//入堆
void HpPush(Hp* hp, HpDataType x);
//出堆
void HpPop(Hp* hp);
//判空
bool HpEmpty(Hp* hp);
//堆顶元素
HpDataType HpTop(Hp* hp);
//向下
void AdjustDown(HpDataType* a, int begin, int end);void swap(HpDataType* e1, HpDataType* e2);void swap(HpDataType* e1, HpDataType* e2)
{HpDataType tmp = *e1;*e1 = *e2;*e2 = tmp;
}//初始化堆
void HpInit(Hp* hp)
{hp->size = 0;hp->capacity = 4;hp->a = (HpDataType*)malloc(sizeof(HpDataType) * (hp->capacity));if (hp->a == NULL){perror("malloc fail!\n");exit(-1);}
}
//销毁堆
void HpDestory(Hp* hp)
{hp->size = hp->capacity = 0;free(hp->a);
}
void check_capacity(Hp* hp)
{if (hp->capacity == hp->size){HpDataType* ptr = (HpDataType*)realloc(hp->a, sizeof(HpDataType) * (hp->capacity * 2));if (ptr == NULL){printf("realloc fail!\n");exit(-1);}hp->capacity *= 2;hp->a = ptr;}
}//排倒序 - 建大堆
void ADjustUp(HpDataType* a, int n)
{int child = n - 1;int parent = (n - 1 - 1) / 2;while (parent >= 0){if (a[child] > a[parent]) //大的往上调{swap(&a[parent], &a[child]);child = parent;parent = (child - 1) / 2;}elsebreak;}
}
//入堆
void HpPush(Hp* hp, HpDataType x)
{assert(hp);check_capacity(hp);hp->a[hp->size] = x;hp->size++;ADjustUp(hp->a,hp->size); // 开区间
}
//堆顶元素
HpDataType HpTop(Hp* hp)
{assert(hp && hp->size > 0);return hp->a[0];
}
//建大堆
void AdjustDown(HpDataType* a, int begin, int end)
{int parent = begin;int child = 2 * parent + 1;while (child < end){if (child + 1 < end && a[child] > a[child + 1]){child += 1;}if (a[parent] > a[child]){swap(&a[parent], &a[child]);parent = child;child = 2 * parent + 1;}elsebreak;}
}
//出堆
void HpPop(Hp* hp)
{assert(hp && hp->size > 0);swap(&hp->a[0],&hp->a[hp->size-1]);//此时这个位置就不能才排了hp->size--;AdjustDown(hp->a,0,hp->size); }
//判空
bool HpEmpty(Hp* hp)
{return hp->size == 0;
}

TopK问题

现在有一个问题

  • 你只有1KB的空间,如何把在4G的文件(假设都是整数)中找出前K(K > 0)大的数字
    既然我们学的是堆,肯定使用堆来解决,如果没有空间限制的话,我们可以把数据都读到内存中,然后排K次大堆即可。可关键我们只有1KB(1024byte)的空间,那如何做呢?

在这里插入图片描述
排成小堆后,堆顶元素就是最小值,每次读入一个比堆顶大的数据,读到最后就是前K个最大的数据了。

代码实现:

#define N 100000 //这里以 10万个数据为例子。
//创建数据
void CreatData()
{FILE* fin = fopen("data.txt", "w");if (fin == NULL){perror("fopen fail!\n");exit(-1);}int i = 0;srand(time(0));for (i = 0; i < N; i++){int x = (rand() + i) % 10000;fprintf(fin,"%d\n", x);}fclose(fin);
}//要求:只给你1KB空间,排出4G个整数的前K个最大值
void TopK()
{FILE* fout = fopen("data.txt","r");if (fout == NULL){perror("fopen fail!\n");exit(-1);}int k;printf("请输入k>: ");scanf("%d", &k);int i = 0;int* KminArr = (int*)malloc(sizeof(int) * k);//读取K个数建最小堆for (i = 0; i < k; i++){fscanf(fout,"%d",&KminArr[i]);}int x = 0;while (fscanf(fout, "%d", &x) > 0){if (x > KminArr[0]){KminArr[0] = x;AdjustDown(KminArr,0,k);}}HeapSort(KminArr,k);//前k个最大值printf("前%d个最大值为:", k);for (i = 0; i < k; i++){printf("%d ", KminArr[i]);}printf("\n");
}

堆排序

当我们了解了向上和向下两种算法的时候,我们就可以来实现啊堆排序了。

如果给你这样一个数组,如何排序呢?
在这里插入图片描述
思路:

建大堆,不断交换堆顶和数组最后一个位置的元素,然后再对剩下的数字进行向下调整算法。直到数组有序为止。

关键就是,我们如何去建大堆呢,前面我们讲堆的时候,那数组经过向上调整算法之后,本来就是一个大堆(ps:建大堆的前提就是源数据也是大堆)。那我们拿到一个随机的数组之后如何建大堆呢?

  • 以最后一个非叶子节点为开始,不断向下调整,直到达到堆顶,此时即为大堆。

在这里插入图片描述
建完大堆之后,不断交换堆顶和数组最后一个位置的元素,然后再对剩下的数字进行向下调整算法。

总代码:

void HeapSort(int* a, int n)
{int i = 0;for (i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a,i,n);}int end = n - 1;while (end > 0){swap(&a[end],&a[0]);AdjustDown(a,0,end);end--;}
}void PrintArray(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}
void TestHeapSort()
{int a[] = { 6,1,3,8,9,3,2,5,10,7 };int sz = sizeof(a) / sizeof(a[0]);HeapSort(a,sz);PrintArray(a,sz);
}

那么堆排序的时间复杂度是多少呢?

我们先来看一下建堆的复杂度:
在这里插入图片描述
建堆是 O(N),下面交换以及排大堆是 N*LOGN,按照大O渐进表示法,我们堆排序的时间复杂度为: O ( N ∗ L O G N ) O(N*LOGN) O(NLOGN)

再来看一下向上调整算法,建堆的复杂度:

在这里插入图片描述
这也是为什么我们不用向上调整算法的原因。

链式存储

先来看一下链式二叉树如何定义。
在这里插入图片描述
每一个节点我们都有数据和左孩子和右孩子。直接看遍历方式

链式二叉树有那么四种遍历方式,他们的访问方式为:

  • 前序遍历: 根 − > 左子树 − > 右子树 根->左子树->右子树 >左子树>右子树
  • 中序遍历: 左子树 − > 根 − > 右子树 左子树->根->右子树 左子树>>右子树
  • 后序遍历: 左子树 − > 右子树 − > 根 左子树->右子树->根 左子树>右子树>

很明显,这三种遍历方式很适合用递归来解决。
再来看一下层序遍历 (以上面大堆结果为例):

在这里插入图片描述
然后再挨个把队列的元素,Pop完就可以了,由于我们现在队列的元素是树的节点,所以最后队列里面全是 N U L L NULL NULL

  • 层序遍历的结果:就是按照层次把树中的元素打印出来。这里我们打印的就为 10 − > 9 − > 3 − > 8 − > 7 − > 3 − > 2 − > 5 − > 1 − > 6 10->9->3->8->7->3->2->5->1->6 10>9>3>8>7>3>2>5>1>6

代码实现:

// 二叉树前序遍历 
void BinaryTreePrevOrder(BTNode* root)
{if (root == NULL)return;printf("%c ", root->_data);BinaryTreePrevOrder(root->_left);BinaryTreePrevOrder(root->_right);
}
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{if (root == NULL)return;BinaryTreePrevOrder(root->_left);printf("%c ", root->_data);BinaryTreePrevOrder(root->_right);
}
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{if (root == NULL)return;BinaryTreePrevOrder(root->_left);BinaryTreePrevOrder(root->_right);printf("%c ", root->_data);
}
// 层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{Queue q;QueueInit(&q);QueuePush(&q,root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);printf("%c ", front->_data);if (front->_left){QueuePush(&q,front->_left);}if (front->_right){QueuePush(&q, front->_right);}}QueueDestroy(&q);}

二叉树的练习

1.二叉树查找值为x的节点

思路:

  • 如果此时我们这个节点的值 == 我们要找的值,直接返回即可。
  • 如果不等于取左右子树去找
  • 返回其中一个答案。

代码:

// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->_data == x)return root;BTNode* left = BinaryTreeFind(root->_left,x);BTNode* right = BinaryTreeFind(root->_right,x);return left == NULL ? right : left;
}
2.判断是否为完全二叉树

思路:

非完全二叉树我们测序遍历的时候跟完全二叉树有什么区别呢?

在这里插入图片描述
那就是我们会入空值进去,所以当我们取队头元素去到空值的时候,我们要判断如果队列中出现了非空的值,那就说明这时一个非完全二叉树。

代码:

// 判断二叉树是否是完全二叉树
bool BinaryTreeComplete(BTNode* root)
{Queue q;QueueInit(&q);QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front == NULL)break;QueuePush(&q,front->_left);QueuePush(&q,front->_right);}while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);if (front != NULL)return false;QueuePop(&q);}QueueDestroy(&q);return true;
}
LC226.翻转二叉树

在这里插入图片描述
思路:

  • 翻转二叉树是把左子树和右子树互换,那么我们每一个子树都要互换。所以我们要不断往子树递归把子树的左子树和右子树交换。这就跟我们的层序遍历一样。

所以我们要递归左右子树,最后再把左右子树交换,然后再返回root。

代码:

struct TreeNode* invertTree(struct TreeNode* root) {if (root == NULL)return NULL;struct TreeNode* left = invertTree(root->left);struct TreeNode* right = invertTree(root->right);root->right = left;root->left = right;return root;
}

在这里插入图片描述

LC572. 另一棵树的子树
  • 建议先做一下这道题100. 相同的树

这题其实就是去找和 subRoot 相同的子树。

注意这个例子:我们要保证我们找的 root和 subRoot 左右子树都相同。
所以这时我们要遍历的root的左子树才能判断与subRoot相同。
在这里插入图片描述
思路:

  • 如果 r o o t 和 s u b R o o t 都为 N U L L ,直接返回 t r u e root和subRoot都为NULL,直接返回true rootsubRoot都为NULL,直接返回true,如果只有一个为空,返回false,如果此时两个树的val相同,判断此时这个位置是否相同,如果相同直接返回true,不想同去root的左右子树,继续去找。只要找到一个就返回true。

代码:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if (p == NULL && q == NULL)return true;    if (p == NULL || q == NULL)return false;if (p->val != q->val)return false;return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if (root == NULL && subRoot == NULL)return true;if (root == NULL || subRoot == NULL)return false;if (root->val == subRoot->val){if (isSameTree(root,subRoot))return true;}return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}
两道选择题

在这里插入图片描述
在这里插入图片描述

结言

到这里本篇文章就结束了。

本篇文章的基本思路如下:
在这里插入图片描述
OK,二叉树部分就到这吧,学C++去了。
在这里插入图片描述

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

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

相关文章

目标检测:IOU

IOU&#xff08;Intersection over Union&#xff09;交并比&#xff1a; 它计算的是“预测的边框”和“真实的边框”的交叠率&#xff0c;即它们的交集和并集的比值。这个比值用于衡量预测边框与真实边框的重叠程度&#xff0c;从而评估目标检测的准确性。 在目标检测任务中…

嵌入式操作系统_2.嵌入式操作系统的一般架构

1.嵌入式操作系统的概念 嵌入式操作系统通常由硬件驱动程序、调式代理、操作系统内核、文件系统和可配置组件等功能组成&#xff0c;并为应用软件提供标准的API&#xff08;Application Programming Interface&#xff09;接口服务。 2.一般嵌入式操作系统的体系结构 从嵌入…

深度神经网络——什么是NLP(自然语言处理)?

自然语言处理&#xff08;NLP&#xff09; 是对使计算机能够处理、分析、解释和推理人类语言的技术和工具的研究和应用。 NLP 是一个跨学科领域&#xff0c;它结合了语言学和计算机科学等领域已建立的技术。 这些技术与人工智能结合使用来创建聊天机器人和数字助理&#xff0c;…

海成蜘蛛池广州官网下载

baidu搜索&#xff1a;如何联系八爪鱼SEO? baidu搜索&#xff1a;如何联系八爪鱼SEO? baidu搜索&#xff1a;如何联系八爪鱼SEO? 当我们给自己的泛目录设置仅蜘蛛抓取生成缓存的时候,我们需要模拟蜘蛛抓取测试我们的设置是否成功。绝大部分时候我们都使用网页蜘蛛模拟抓取测…

2024.618到底买什么数码值得?带你一起来看看!

在618期间&#xff0c;这些新品可能会有特别的优惠活动&#xff0c;包括但不限于折扣、满减、赠品等。因此&#xff0c;如果你正在寻找一款适合自己的数码产品&#xff0c;不妨关注各大电商平台的618促销活动&#xff0c;把握机会&#xff0c;以优惠的价格购买到心仪的产品。 …

文件操作(1)(C语言版)

前言&#xff1a; 为什么要学习文件操作&#xff1a; 1、如果大家写过一些代码&#xff0c;当运行结束的时候&#xff0c;这些运行结果将不复存在&#xff0c;除非&#xff0c;再次运行时这些结果才能展现在屏幕上面&#xff0c;就比如之前写过的通讯录。 现实中的通讯录可以保…

【数据结构初阶】--- 堆

文章目录 一、什么是堆&#xff1f;树二叉树完全二叉树堆的分类堆的实现方法 二、堆的操作堆的定义初始化插入数据&#xff08;包含向上调整详细讲解&#xff09;向上调整删除堆顶元素&#xff08;包含向下调整详细讲解&#xff09;向下调整返回堆顶元素判断堆是否为空销毁 三、…

一个开源的快速准确地将 PDF 转换为 markdown工具

大家好&#xff0c;今天给大家分享的是一个开源的快速准确地将 PDF 转换为 markdown工具。 Marker是一款功能强大的PDF转换工具&#xff0c;它能够将PDF文件快速、准确地转换为Markdown格式。这款工具特别适合处理书籍和科学论文&#xff0c;支持所有语言的转换&#xff0c;并…

2024年最佳插电式混合动力电动汽车

对电动汽车充满好奇和环保意识的司机们还没有准备好跨入纯电动汽车&#xff0c;他们可以找到一个折衷方案&#xff0c;即插电式混合动力车。 在过去的16年里&#xff0c;我一直在把握汽车行业的脉搏。试驾数百辆汽车、电动汽车、插电式混合动力车&#xff0c;跟踪汽车行业的新闻…

DAY04 HTMLCSS

文章目录 一 表单(1) 数字控件(2) 颜色控件(3) 日期控件(4) 月份控件(5) 星期控件(6) 搜索控件(7) 范围控件 二 浮动框架三 结构化标签四 CSS1 CSS概述2 CSS的编写位置1. inline style 行内样式2. inner style 内部样式3. outer style 外部样式4. 小结 3 CSS选择器1. 通用选择器…

一个示例学习C语言到汇编层面

给出以下代码 #include<stdio.h> int main() {int x 0, y 0, z 0;while (1) {x 0;y 1;do {printf("%d\n", x);z x y;x y;y z;} while (x < 255);}return 0; }我们把这个程序编写成32位程序&#xff0c;然后我们放入IDA中进行分析 .text:0080187…

Mysql开启查询日志(General Log)

1、增加配置&#xff1a; /etc/my.cnf [mysqld] general_log1 general_log_file/var/log/mysql/query.log 2、增加目录和文件&#xff0c;并且授权 可以使用以下命令修改权限&#xff1a; 创建目录&#xff1a;sudo mkdir -p /var/log/mysql 更改目录所有者&#xff1a;sudo…

【日常记录】【插件】prisma 链接MySQL数据库 简单入门

文章目录 1、新建项目&#xff0c;使用prisma链接数据库1.1、先创建一个项目1.2、初始化 npm 配置文件及下载依赖1.3、初始化TS配置文件1.4、初始化 prisma1.5、更改 prisma/schema.prisma1.6 更改.env 文件1.7 编写 prisma/schema.prisma1.8 将编写的 prisma/schema.prisma 映…

OSPF被动接口配置(华为)

#交换设备 OSPF被动接口配置 一、基本概念 OSPF被动接口&#xff0c;也称为抑制接口&#xff0c;即将路由器某一接口配置为被动接口后&#xff0c;该接口不会再接受和发送OSPF报文 二、使用场景 在路由器与终端相近或者直接相连的一侧配置被动接口 因为OSPF会定期发送报文…

ensp防火墙web密码重置(前提通过console可以登录)

客户电脑是命令行没有用户名直接输入密码就可以登录了&#xff0c;但是web端不知道admin的密码 前两天遇到运维单位的一台防火墙web网页不知道用户名密码&#xff0c;默认的登录不了&#xff0c;但是通过console可以登录命令行&#xff0c;今天就记录下如何通过命令行修改web页…

海康视觉算法平台VisionMaster 4.3.0 C# 二次开发01 加载方案并获取结果

前言 第一次使用海康视觉算法平台VisionMaster 4.3.0&#xff0c;项目中要使用这个平台进行视觉处理并获取结果。 运行效果 开发环境 C#&#xff0c; WPF&#xff0c; vs2022, 海康视觉算法平台VisionMaster 4.3.0 基本概念 上图这些.sol为后缀的是vm的方案文件。 打开方案文…

鸿蒙开发过程中出现很多.js或者.js.map怎么办

学习HarmonyOS应用开发已有几天了, 今天在打开DevEco Studio正常开发的过程中, 预览、修改、刷新, 然后就出现了大量的.js以及.js.map文件 这个虽然不影响开发&#xff0c;但是影响体验 问题原因&#xff1a; 编译/预览过程产生的缓存文件, 已反馈给鸿蒙的IDE团队 解决办法…

树莓派pico入坑笔记,快捷键键盘制作

使用usb_hid功能制作快捷键小键盘&#xff0c;定义了6个键&#xff0c;分别是 ctrlz ctrlv ctrlc ctrla ctrlw ctrln 对应引脚 board.GP4, board.GP8, board.GP13 board.GP28, board.GP20, board.GP17 需要用到的库&#xff0c;记得复制进单片机存储里面 然后是main主程…

3dmax2025能用云渲染吗?2025最新云渲染渲染100使用方法

3dmax2025还没用上云渲染&#xff1f;简单3步用上云渲染。 第一步&#xff0c;打开浏览器搜索渲染100&#xff0c;并进入下载客户端并安装 第二步&#xff0c;打开已安装的客户端进行安装&#xff0c;点击登录&#xff0c;未登录注册个账号即可&#xff08;注册账号时邀请码填…

Sermant标签路由能力在同城双活场景的应用

作者&#xff1a;聂子雄 华为云高级软件工程师 摘要&#xff1a;目前应用上云已成为趋势&#xff0c;用户也对应用在云上的高可靠方案有更高追求&#xff0c;目前同城双活场景作为应用高可靠方案中的一种常见实践方案&#xff0c;对微服务流量提出了数据中心亲和性的要求&…