数据结构——二叉树的基本操作及进阶操作

前言

介绍

 🍃数据结构专区:数据结构

参考

该部分知识参考于《数据结构(C语言版 第2版)》116 ~ 122页 及 《数据结构教程》201 ~ 213页

重点

树的基本实现并不难,重点在于对递归的理解才是树这部分知识带来的最大收获,因为树的逻辑结构就保证了使用递归思路来解决是最优的算法

由于树的基础知识太多,这里只进行简单解释,本篇主要是对基本操作代码的解释,后序的文章会跟进树的相关知识和性质的

🌈每一个清晨,都是世界对你说的最温柔的早安:ૢ(≧▽≦)و✨


目录

前言

1、二叉树的基础知识

1.1、定义与特点

1.2、基本形态与类型

1.3、性质与存储

1.4、遍历方法

2、链表树的操作

2.1 宏定义及结构体定义

2.2 前中后序遍历法

2.3 初始化树

2.4 创建新节点

2.5 创建树

2.6 销毁树

2.7 判空

2.8 求树的深度

2.9 根据值查找节点

2.10 求树根

2.11 求结点总数

2.12 输出叶子节点

2.13 计算值为x的节点所在的层数

2.14 计算第k层的节点数

2.15 复制二叉树

2.16 判断两棵树是否相似

2.17 查找某节点的双亲节点

2.18 其他一些不重要函数

2.19 整体代码(含测试代码)

结语


1、二叉树的基础知识

1.1、定义与特点

  • 定义:二叉树(Binary Tree)是树形结构的一个重要类型,是一种每个节点最多有两个子树(左子树和右子树)的有序树。

  • 特点

    • 每个节点最多只能有两棵子树,且有左右之分,次序不能颠倒。
    • 二叉树可以是空树,或者由根节点和左、右子树组成,其中左子树和右子树也同样是二叉树。

1.2、基本形态与类型

  • 基本形态

    • 空二叉树:没有任何节点的二叉树。
    • 只有一个根节点的二叉树。
    • 只有左子树或只有右子树的二叉树。
    • 完全二叉树:深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树。
    • 满二叉树:如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树。
  • 特殊类型

    • 二叉查找树(Binary Search Tree):左子树上的所有节点值均小于根节点值,右子树上的所有节点值均大于根节点值。
    • 平衡二叉树(如AVL树):左右子树都是平衡二叉树,且所有节点左、右子树深度之差的绝对值不大于1。
    • 红黑树:除了具备二叉查找树的特性外,还有额外的特性以保持树的自平衡。
    • 哈夫曼树(Huffman Tree):带权路径长度最短的树,常用于通信中的压缩编码。

1.3、性质与存储

  • 性质

    • 二叉树的第i层上至多有2^(i-1)个节点。
    • 深度为h的二叉树中至多含有2^h-1个节点。
    • 在任意一棵二叉树中,若叶子节点数为n0,度为2的节点数为n2,则必有n0=n2+1。
  • 存储方式

    • 顺序存储:使用数组来存储二叉树的节点,通常适用于完全二叉树。
    • 链式存储:使用链表来存储二叉树的节点,每个节点包含数据域和指向左、右子节点的指针。

1.4、遍历方法

  • 遍历:是对树的一种最基本的运算,指按一定的规则和顺序走遍二叉树的所有节点,使每一个节点都被访问一次,而且只被访问一次。

  • 遍历方法

    • 先序遍历(Preorder Traversal):访问根节点,然后遍历左子树,最后遍历右子树。
    • 中序遍历(Inorder Traversal):遍历左子树,访问根节点,然后遍历右子树。中序遍历二叉排序树可得到一个关键字的有序序列。
    • 后序遍历(Postorder Traversal):遍历左子树,遍历右子树,最后访问根节点。

2、链表树的操作

一、由于二叉树的顺序存储结构具有顺序存储结构的固有缺陷,使得二叉树的插入、删除等运算十分麻烦,所以对于一般二叉树通常采用链式存储方式

二、这里我采用左右孩子的存储方法

三、下面我会先把各函数代码进行简单介绍并粘贴出来,若有不懂的可以向下翻找会有函数的详细介绍

2.1 宏定义及结构体定义

#include<stdio.h>
#include<iostream>
using namespace std;typedef char TElemType;
typedef struct BiTNode {TElemType data;struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

2.2 前中后序遍历法

//前序递归遍历法
void PreOrder(BiTree T)
{if (T != NULL){cout << T->data << " ";PreOrder(T->lchild);PreOrder(T->rchild);}
}//中序递归遍历法
void InOrder(BiTree T)
{if (T != NULL){InOrder(T->lchild);cout << T->data << " ";InOrder(T->rchild);}
}//后序递归遍历法
void PostOrder(BiTree T)
{if (T != NULL){PostOrder(T->lchild);PostOrder(T->rchild);cout << T->data << " ";}
}

2.3 初始化树

//初始化树
void InitTree(BiTree& T)
{T = NULL;
}

2.4 创建新节点

//创建新节点
BiTNode* CreatNewNode(TElemType value)
{BiTNode* node = new BiTNode;//等价于//BiTNode* node = (BiTNode*)malloc(sizeof(BiTNode));node->data = value;node->lchild = NULL;node->rchild = NULL;return node;
}

2.5 创建树

//创建树
void CreateTree(BiTree& T, char* definition)
{static int i = 0;  //静态变量,每次递归进入过程中都会i++char ch = definition[i++];if (ch == '#'){T = NULL;}else{T = CreatNewNode(ch);CreateTree(T->lchild, definition);CreateTree(T->rchild, definition);}
}

2.6 销毁树

//销毁树
void DestroyTree(BiTree& T)
{if (T != NULL){DestroyTree(T->lchild);DestroyTree(T->rchild);free(T);T = NULL;}
}

2.7 判空

//判空
int TreeEmpty(BiTree T)
{if (T == NULL){return 1;}else{return 0;}
}

2.8 求树的深度

//求树的深度
int TreeDepth(BiTree T)
{//定义左右子树的高度,作为最后返回时的比较值int lchildh = 0, rchildh = 0;if (T == NULL){return 0;}else{lchildh = TreeDepth(T->lchild);rchildh = TreeDepth(T->rchild);return lchildh > rchildh ? lchildh + 1 : rchildh + 1;}
}

2.9 根据值查找节点

//查找某个节点
BiTNode* FindNode(BiTree T, TElemType x)
{BiTNode* p;//作为遍历if (T == NULL){return NULL;}if (T->data == x){return T;}//左递归查找p = FindNode(T->lchild, x);if (p != NULL){return p;}else{//否则进行右递归查找return FindNode(T->rchild, x);}
}

2.10 求树根

//求树根
BiTNode* Root(BiTree T)
{if (T == NULL){printf("ERROR:Tree is NULL!");}return T;
}

2.11 求结点总数

//求结点总数
int Nodes(BiTree T)
{if (T == NULL){return 0;}return Nodes(T->lchild) + Nodes(T->rchild) + 1;
}

2.12 输出叶子节点

//输出叶子结点
void DispLeaf(BiTree T)
{if (T != NULL){if (T->lchild == NULL && T->rchild == NULL){cout << T->data << "  ";   //访问叶子节点}DispLeaf(T->lchild);  //输出左子树中的叶子节点DispLeaf(T->rchild);  //输出右子树中的叶子节点}
}

2.13 计算值为x的节点所在的层数

//计算某个节点值为x的层次(若在根结点 h = 1,树为空h = 0)
int Level(BiTree T, TElemType x, int h)
{int l;if (T == NULL){return(0);}if (T->data == x){return(h);}l = Level(T->lchild, x, h + 1);if (l != 0){return(l);}else{return(Level(T->rchild, x, h + 1));}
}

2.14 计算第k层的节点数

//计算第k层的结点数
void LnodeNum(BiTree T, int h, int k, int& n)
{if (T == NULL){return;//空树直接返回}//处理非空树if (h == k)n++;  //当前访问的结点在第k层时,n++else if (h < k) //若当前节点层次小于k,递归处理左右子树{LnodeNum(T->lchild, h + 1, k, n);LnodeNum(T->rchild, h + 1, k, n);}
}

2.15 复制二叉树

//复制二叉树
void Copy(BiTree T, BiTree& NewT)
{//复制一棵和T完全相同的二叉树if (T == NULL){NewT = NULL;return;}else{NewT = new BiTNode;NewT->data = T->data;Copy(T->lchild, NewT->lchild);Copy(T->rchild, NewT->rchild);}
}

2.16 判断两棵树是否相似

//判断两棵树是否相似
bool Like(BiTree T1, BiTree T2)
{bool like1, like2;if (T1 == NULL && T2 == NULL){return true;}else if (T1 == NULL || T2 == NULL){return false;}else{like1 = Like(T1->lchild, T2->lchild);like2 = Like(T1->rchild, T2->rchild);return(like1 && like2);}
}

2.17 查找某节点的双亲节点

//查找某节点的双亲节点
//这里需要用到两个函数来完成
//1.辅助函数
BiTNode* ParentHelper(BiTNode* root, BiTNode* cur_e)
{if (root == NULL || cur_e == NULL){return NULL;}//如果root节点的左右节点中某一个是目标节点if (root->lchild == cur_e || root->rchild == cur_e){return root;}//进行左递归查找BiTNode* leftResult = ParentHelper(root->lchild, cur_e);if (leftResult != NULL){return leftResult;}//否则递归查找右子树return ParentHelper(root->rchild, cur_e);
}
//2.查询函数
BiTNode* Parent(BiTree& T, BiTNode* cur_e)
{if (T == NULL || cur_e == NULL){return NULL;}//调用辅助函数查找双亲节点return ParentHelper(T, cur_e);
}

2.18 其他一些不重要函数

//不重要函数
//求某个节点的值
TElemType Value(BiTree& T, BiTNode* cur_e)
{if (T == NULL || cur_e == NULL){printf("ERROR:Tree or Node is NULL!");exit(1);}return cur_e->data;
}//给某个节点赋值
void Assign(BiTree& T, BiTNode* cur_e, TElemType value)
{if (T == NULL || cur_e == NULL){printf("ERROR:Tree or Node is NULL!");exit(1);}cur_e->data = value;
}//求某节点的左孩子结点
BiTNode* LeftChild(BiTree T, BiTNode* cur_e)
{if (T == NULL || cur_e == NULL){printf("ERROR: Tree or cur_e is NULL!");exit(1);}return cur_e->lchild;
}//求某节点的右孩子结点
BiTNode* RightChild(BiTree T, BiTNode* cur_e)
{if (T == NULL || cur_e == NULL){printf("ERROR: Tree or cur_e if NULL!");exit(1);}return cur_e->rchild;
}

2.19 整体代码(含测试代码)

#include<stdio.h>
#include<iostream>
using namespace std;typedef char TElemType;
typedef struct BiTNode {TElemType data;struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;//前序递归遍历法
void PreOrder(BiTree T)
{if (T != NULL){cout << T->data << " ";PreOrder(T->lchild);PreOrder(T->rchild);}
}//中序递归遍历法
void InOrder(BiTree T)
{if (T != NULL){InOrder(T->lchild);cout << T->data << " ";InOrder(T->rchild);}
}//后序递归遍历法
void PostOrder(BiTree T)
{if (T != NULL){PostOrder(T->lchild);PostOrder(T->rchild);cout << T->data << " ";}
}//初始化树
void InitTree(BiTree& T)
{T = NULL;
}//创建新节点
BiTNode* CreatNewNode(TElemType value)
{BiTNode* node = new BiTNode;//等价于//BiTNode* node = (BiTNode*)malloc(sizeof(BiTNode));node->data = value;node->lchild = NULL;node->rchild = NULL;return node;
}//创建树
void CreateTree(BiTree& T, char* definition)
{static int i = 0;  //静态变量,每次递归进入过程中都会i++char ch = definition[i++];if (ch == '#'){T = NULL;}else{T = CreatNewNode(ch);CreateTree(T->lchild, definition);CreateTree(T->rchild, definition);}
}//销毁树
void DestroyTree(BiTree& T)
{if (T != NULL){DestroyTree(T->lchild);DestroyTree(T->rchild);free(T);T = NULL;}
}//清空树
//在C代码作为主要函数的代码下,清空树和销毁树是几乎一样的操作
//唯一差别在于,销毁树是树根也销毁,清空树保存其树根
//如果是C++代码下
//BinaryTree类中添加了一个析构函数(~BinaryTree()),它会在对象被删除时自动调用DestroyTree。
//这确保了即使用户忘记显式调用DestroyTree,内存也会被正确释放//判空
int TreeEmpty(BiTree T)
{if (T == NULL){return 1;}else{return 0;}
}//求树的深度
int TreeDepth(BiTree T)
{//定义左右子树的高度,作为最后返回时的比较值int lchildh = 0, rchildh = 0;if (T == NULL){return 0;}else{lchildh = TreeDepth(T->lchild);rchildh = TreeDepth(T->rchild);return lchildh > rchildh ? lchildh + 1 : rchildh + 1;}
}//查找某个节点
BiTNode* FindNode(BiTree T, TElemType x)
{BiTNode* p;//作为遍历if (T == NULL){return NULL;}if (T->data == x){return T;}//左递归查找p = FindNode(T->lchild, x);if (p != NULL){return p;}else{//否则进行右递归查找return FindNode(T->rchild, x);}
}//求树根
BiTNode* Root(BiTree T)
{if (T == NULL){printf("ERROR:Tree is NULL!");}return T;
}//求结点总数
int Nodes(BiTree T)
{if (T == NULL){return 0;}return Nodes(T->lchild) + Nodes(T->rchild) + 1;
}//输出叶子结点
void DispLeaf(BiTree T)
{if (T != NULL){if (T->lchild == NULL && T->rchild == NULL){cout << T->data << "  ";   //访问叶子节点}DispLeaf(T->lchild);  //输出左子树中的叶子节点DispLeaf(T->rchild);  //输出右子树中的叶子节点}
}//计算某个节点值为x的层次(若在根结点 h = 1,树为空h = 0)
int Level(BiTree T, TElemType x, int h)
{int l;if (T == NULL){return(0);}if (T->data == x){return(h);}l = Level(T->lchild, x, h + 1);if (l != 0){return(l);}else{return(Level(T->rchild, x, h + 1));}
}//计算第k层的结点数
void LnodeNum(BiTree T, int h, int k, int& n)
{if (T == NULL){return;//空树直接返回}//处理非空树if (h == k)n++;  //当前访问的结点在第k层时,n++else if (h < k) //若当前节点层次小于k,递归处理左右子树{LnodeNum(T->lchild, h + 1, k, n);LnodeNum(T->rchild, h + 1, k, n);}
}//复制二叉树
void Copy(BiTree T, BiTree& NewT)
{//复制一棵和T完全相同的二叉树if (T == NULL){NewT = NULL;return;}else{NewT = new BiTNode;NewT->data = T->data;Copy(T->lchild, NewT->lchild);Copy(T->rchild, NewT->rchild);}
}//判断两棵树是否相似
bool Like(BiTree T1, BiTree T2)
{bool like1, like2;if (T1 == NULL && T2 == NULL){return true;}else if (T1 == NULL || T2 == NULL){return false;}else{like1 = Like(T1->lchild, T2->lchild);like2 = Like(T1->rchild, T2->rchild);return(like1 && like2);}
}//查找某节点的双亲节点
//这里需要用到两个函数来完成
//1.辅助函数
BiTNode* ParentHelper(BiTNode* root, BiTNode* cur_e)
{if (root == NULL || cur_e == NULL){return NULL;}//如果root节点的左右节点中某一个是目标节点if (root->lchild == cur_e || root->rchild == cur_e){return root;}//进行左递归查找BiTNode* leftResult = ParentHelper(root->lchild, cur_e);if (leftResult != NULL){return leftResult;}//否则递归查找右子树return ParentHelper(root->rchild, cur_e);
}
//2.查询函数
BiTNode* Parent(BiTree& T, BiTNode* cur_e)
{if (T == NULL || cur_e == NULL){return NULL;}//调用辅助函数查找双亲节点return ParentHelper(T, cur_e);
}//不重要函数
//求某个节点的值
TElemType Value(BiTree& T, BiTNode* cur_e)
{if (T == NULL || cur_e == NULL){printf("ERROR:Tree or Node is NULL!");exit(1);}return cur_e->data;
}//给某个节点赋值
void Assign(BiTree& T, BiTNode* cur_e, TElemType value)
{if (T == NULL || cur_e == NULL){printf("ERROR:Tree or Node is NULL!");exit(1);}cur_e->data = value;
}//求某节点的左孩子结点
BiTNode* LeftChild(BiTree T, BiTNode* cur_e)
{if (T == NULL || cur_e == NULL){printf("ERROR: Tree or cur_e is NULL!");exit(1);}return cur_e->lchild;
}//求某节点的右孩子结点
BiTNode* RightChild(BiTree T, BiTNode* cur_e)
{if (T == NULL || cur_e == NULL){printf("ERROR: Tree or cur_e if NULL!");exit(1);}return cur_e->rchild;
}int main() {BiTree T, NewT;char definition[] = "ABD##E##CF##G#H##";// 测试初始化和创建树InitTree(T);CreateTree(T, definition);cout << "初始化树和创建树的测试:" << endl;// 测试遍历cout << "\n前序遍历: ";PreOrder(T);cout << "\n中序遍历: ";InOrder(T);cout << "\n后序遍历: ";PostOrder(T);// 测试TreeEmpty和TreeDepthcout << "\n\n树是否为空? " << (TreeEmpty(T) ? "Yes" : "No");cout << "\n树深: " << TreeDepth(T);// 测试FindNodeTElemType searchValue = 'D';BiTNode* foundNode = FindNode(T, searchValue);cout << "\n\n查找节点 '" << searchValue << "': "<< (foundNode ? "Found" : "Not found");// 测试RootBiTNode* root = Root(T);cout << "\n树根: " << (root ? root->data : ' ');// 测试Nodes和DispLeafcout << "\n所有节点数: " << Nodes(T);cout << "\n叶子结点: ";DispLeaf(T);// 测试Levelcout << "\n\n'E'所在的层数: " << Level(T, 'E', 1);// 测试LnodeNumint nodeCount = 0;LnodeNum(T, 1, 3, nodeCount);cout << "\n第3层的结点数: " << nodeCount;// 测试CopyCopy(T, NewT);cout << "\n\n复制一棵树,并进行中序遍历: ";InOrder(NewT);// 测试Likecout << "\n上面复制的树和原树是否相似? " << (Like(T, NewT) ? "Yes" : "No");// 测试ParentBiTNode* nodeE = FindNode(T, 'E');BiTNode* parentOfE = Parent(T, nodeE);cout << "\n\n'E'的双亲节点: " << (parentOfE ? parentOfE->data : ' ');// 清理内存DestroyTree(T);DestroyTree(NewT);cout << "\n\nAll tests completed." << endl;return 0;
}

结语

数据结构树这里的相关操作和知识点非常多,并且一环套一环,这里需要大家拥有较多的耐心来一步步走下去,相信一定会更好的!

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

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

相关文章

python绝对值怎么表示

python abs()函数用于获取数字的绝对值&#xff0c;参数可以是负数、正数、浮点数或者长整形。 语法&#xff1a; abs( x ) 下面是详细参数&#xff1a; X&#xff1a;这是一个数值表达式。 返回值&#xff1a; x的绝对值。 例如&#xff1a; #!/usr/bin/python print &q…

smbms(2)

目录 一、修改密码功能实现 二、优化密码修改&#xff0c;加入旧密码确认环节【使用Ajax】 三、用户管理实现 获取用户数量 获取用户列表 获取角色列表 Servlet 一、修改密码功能实现 1、导入前端素材 2、UserDao接口 3、UserDaoImpl实现类 4、UserService接口 5、Us…

力扣76~80题

题76&#xff08;困难&#xff09;&#xff1a; 分析&#xff1a; 这道题其实不难&#xff0c;但是是我做最久的了&#xff0c;我居然去用res去接所有可能得值&#xff0c;然后再求长度导致空间暴力&#xff0c;我还以为是我queue的问题。。。 最后用暴力求解解的&#xff0c…

【wpf】08 xml文件的存取操作

在使用wpf编程过程中&#xff0c;会用到xml的配置文件&#xff0c;实现对其读取和存储的操作是必须的。 1 xml说明 可扩展标记语言 (Extensible Markup Language, XML) &#xff0c;标准通用标记语言的子集&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许…

破局汽车基础软件发展丨昂辉科技亮相2024芜湖新能源汽车零部件和后市场生态博览会

10月14—17日&#xff0c;2024芜湖新能源汽车零部件和后市场生态博览会在芜湖市宜居国际博览中心盛大开幕。昂辉科技携新一代EasySAR车载基础软件工具链产品亮相核心零部件展区。 作为新能源汽车行业的一次盛会&#xff0c;本届博览会以“会议论坛展区展示”为特色&#xff0c…

cefsharp79.1.360(Chromium 79.0.3945.130)支持H264视频播放-PDF预览 老版本回顾系列体验

一、关于此版本 版本:Cef 79.1.36/CefSharp 79.1.360/Chromium 79.0.3945.130/支持H264/支持PDF预览 支持PDF预览和H264推荐版本 63/79/84/88/100/111/125 运行环境需要 visual c++ 2015不支持xp/vista/2003/2008默认不支持h264(版权问题)支持打印预览 print preview已知问题…

网络资源模板--Android Studio 实现简易新闻App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易新闻App 二、项目测试环境 三、项目详情 登录页 用户输入&#xff1a; 提供账号和密码输入框&#xff0c;用户可以输入登录信息。支持“记…

RestHighLevelClient操作es查询文档

目录 利用RestHighLevelClient客户端操作es查询文档 查询match_all dsl语句&#xff1a; ​编辑 java代码 小结 match字段全文检索查询 dsl语句 java代码 multi_match多字段全文检索查询 dsl语句 java代码 term精确查询 dsl语句 java代码 range范围查询 dsl语句 j…

基于SpringBoot的旅店管理系统的设计与实现源码+Vue前端(酒店、民宿、功能较多)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Windows系统部署redis自启动服务【亲测可用】

文章目录 引言I redis以本地服务运行(Windows service)使用MSI安装包配置文件,配置端口和密码II redis服务以终端命令启动缺点运行redis-server并指定端口和密码III 知识扩展确认redis-server可用性Installing the Service引言 服务器是Windows系统,所以使用Windows不是re…

文献阅读:通过深度神经网络联合建模多个切片构建3D整体生物体空间图谱

文献介绍 文献题目&#xff1a; 通过深度神经网络联合建模多个切片构建3D整体生物体空间图谱 研究团队&#xff1a; 杨灿&#xff08;香港科技大学&#xff09;、吴若昊&#xff08;香港科技大学&#xff09; 发表时间&#xff1a; 2023-10-19 发表期刊&#xff1a; Nature M…

每日OJ题_牛客_[NOIP2001]装箱问题_01背包_C++_Java

目录 牛客_[NOIP2001]装箱问题_01背包 题目解析 C代码 Java代码 牛客_[NOIP2001]装箱问题_01背包 [NOIP2001]装箱问题 (nowcoder.com) 描述&#xff1a; 有一个箱子容量为V&#xff08;正整数&#xff0c;0 ≤ V ≤ 20000&#xff09;&#xff0c;同时有n个物品&…

Electron入门笔记

Electron入门笔记 ElectronElectron 是什么Electron流程模型创建第一个Electron项目配置自动重启主进程和渲染进程通信打包应用 Electron Electron 是什么 跨平台的桌面应用开发框架使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium和 Node.js Electro…

Print Settings Page 打印设置页面

“打印设置”页面提供了设计时工具&#xff0c;用于自定义控制视图打印版本外观的打印选项。此页面如下图所示。 “选项”和“行为”选项卡式页面提供对视图打印选项的设计时访问&#xff0c;这些选项可通过其 GridView.OptionsPrint 属性或卡片视图的 CardView.OptionsPrint 进…

基于vue框架的的点餐系统1o2te(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,商家,菜品分类,菜品信息 开题报告内容 基于Vue框架的点餐系统开题报告 一、研究背景与意义 随着移动互联网技术的飞速发展&#xff0c;餐饮行业也迎来了数字化转型的浪潮。传统的点餐方式&#xff0c;如纸质菜单和人工记录&…

颐驰06持续交付,明日科技赋能出行生活

在全球智能出行领域&#xff0c;自动驾驶技术的发展一直是行业关注的焦点。不久前&#xff0c;特斯拉发布的自动驾驶出租车引发了全球关注&#xff0c;但由于缺乏具体的技术细节&#xff0c;导致投资者信心受挫&#xff0c;特斯拉股票一度下跌近10%。与此同时&#xff0c;中国车…

CTF(四)

导言&#xff1a; 本文主要讲述在CTF竞赛中&#xff0c;web类题目file_include。 靶场链接&#xff1a;攻防世界 (xctf.org.cn) 一&#xff0c;观察页面。 可以看到一段php代码。从则段代码中我们可以知道&#xff1a; 1&#xff0c;使用include引入check.php文件&#xff…

Nodejs使用http模块创建Web服务器接收解析RFID读卡器刷卡数据

本示例使用设备&#xff1a; https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1buHvw58&ftt&id22173428704 Javascript源码 //引用http模块创建web服务器&#xff0c;监听指定的端口获取以GET、POST、JSON等方式上传的数据&#xff0c;并回应驱动读卡…

【论文学习与撰写】论文里的Mathtype公式复制粘贴,跨文档复制后错码/错位问题的解决

1、描述 问题&#xff1a;论文的草稿已经写好&#xff0c;里面的公式之类的都已经一个个打上去了 但是把草稿里的正文和公式粘贴在另一个文档里的时候&#xff0c;会出些公式格式错误的情况 那该怎么操作保证复制后的公式保持原格式呢 选中复制的内容&#xff0c;在另一个文…

探索YOLO v11:3D人工智能的RGB-D视觉革命

哈喽&#xff0c;各位OAK中国的朋友们! 大家好我是张伯生 今天&#xff0c;我想给大家演示一下最新发布的Yolo V11神经网络 下面我将演示的一个程序是&#xff1a;同时在我们的OAK相机上跑Yolo V11和RGB-D&#xff0c;也就是彩色相机和深度图的一个叠加的一个效果 RGB-D和Yo…