C++ 二叉树(建立、销毁、前中后序遍历和层次遍历,寻找双亲结点等)

(1)结构体和类定义

struct BTreeNode {T data;BTreeNode* left, * right;BTreeNode() :data(0), left(nullptr), right(nullptr) {}BTreeNode(T val, BTreeNode<T>* leftChild = nullptr, BTreeNode<T>* rightChild = nullptr):data(val), left(leftChild), right(rightChild) {}};template<class T>
class BTree {
public:BTree() :root(nullptr) {}										      // 构造函数BTree(string str);                                                    // 重载void createTree(BTreeNode<T>*& bt, string str);                       // 创建二次树~BTree();														      // 析构函数bool IsEmpty();													      // 判二叉树空否?int Size(BTreeNode<T>* cur);                                          // 计算结点个数int getSize();                                                        // 获取结点个数BTreeNode<T>* getData(T& item, BTreeNode<T>* cur);	                  // 取得结点数据bool Find(T& item);		                                              // 判断item是否在树中int Height(BTreeNode<T>* bt);                                         // 求树高度int getHeight();                                                      // 获取树高度BTreeNode<T>* getRoot();	                                          // 取根void preOrderTraversal(BTreeNode<T>* cur, vector<int>& vec);          // 前序遍历void inOrderTraversal(BTreeNode<T>* cur, vector<int>& vec);		      // 中序遍历void postOrderTraversal(BTreeNode<T>* cur, vector<int>& vec);         // 后序遍历void levelOrderTraversal(BTreeNode<T>* cur, vector<int>& vec);        // 层序遍历vector<T> preOrder();						                          // 调用前序遍历,返回vectorvector<T> inOrder();											      // 调用中序遍历,返回vectorvector<T> postOrder();											      // 调用后序遍历,返回vectorvector<T> levelOrder();                                               // 调用层序遍历,返回vectorvoid CopyTree(BTreeNode<T>* root, BTreeNode<T>*& copyRoot);           // 二叉树复制void Copy(BTreeNode<T>*& copyRoot);                                   // 调用二叉树复制void destroyCopyTree(BTreeNode<T>*& copyRoot);                        // 销毁复制二叉树BTreeNode<T>* FindParent(BTreeNode<T>* root, BTreeNode<T>* node);     // 寻找双亲BTreeNode<T>* LeftChild(BTreeNode<T>* node) {                         //求结点 node 的左孩子return (node != nullptr) ? node->left : nullptr;}BTreeNode<T>* RightChild(BTreeNode<T>* node) {                        //求结点 node 的右孩子return (node != nullptr) ? node->right : nullptr;}protected:BTreeNode<T>* root;void destroyTree(BTreeNode<T>* node);                                // 销毁二叉树
};

(2)创建二叉树

template<class T>
BTree<T>::BTree(string str) {createTree(root, str);cout << "报告:创建一颗二叉树,完成!!!" << endl;
}template<class T>
void BTree<T>::createTree(BTreeNode<T>*& bt, string str) {static int i = 0;char ch = ' ';ch = str[i++];if (ch == '#') bt = nullptr;else {bt = new BTreeNode<T>(ch);createTree(bt->left, str);createTree(bt->right, str);}
};

(3)前中后序遍历和层序遍历

// 前序遍历
template<class T>
void BTree<T>::preOrderTraversal(BTreeNode<T>* cur, vector<int>& vec) {if (cur == nullptr)return;vec.push_back(cur->data);           // 中preOrderTraversal(cur->left, vec);  // 左preOrderTraversal(cur->right, vec); // 右
}// 调用前序遍历,返回vector
template<class T>
vector<T> BTree<T>::preOrder() {cout << "获取前序遍历数组...." << endl;cout << ">>>>";vector<T> resVec;preOrderTraversal(root, resVec);return resVec;
}// 中序遍历
template<class T>
void BTree<T>::inOrderTraversal(BTreeNode<T>* cur, vector<int>& vec) {if (cur == nullptr)return;inOrderTraversal(cur->left, vec);  // 左vec.push_back(cur->data);          // 中inOrderTraversal(cur->right, vec); // 右
}// 调用中序遍历,返回vector
template<class T>
vector<T> BTree<T>::inOrder() {cout << "获取中序遍历数组...." << endl;cout << ">>>>";vector<T> resVec;inOrderTraversal(root, resVec);return resVec;
}// 后序遍历
template<class T>
void BTree<T>::postOrderTraversal(BTreeNode<T>* cur, vector<int>& vec) {if (cur == nullptr)return;postOrderTraversal(cur->left, vec);  // 左postOrderTraversal(cur->right, vec); // 右vec.push_back(cur->data);            // 中
}// 调用后序遍历,返回vector
template<class T>
vector<T> BTree<T>::postOrder() {cout << "获取后序遍历数组...." << endl;cout << ">>>>";vector<T> resVec;postOrderTraversal(root, resVec);return resVec;
}// 层序遍历
template<class T>
void BTree<T>::levelOrderTraversal(BTreeNode<T>* cur, vector<int>& vec) {if (cur == nullptr) return;queue<BTreeNode<T>*> Queue;BTreeNode<T>* p;Queue.push(cur); // 根结点入队列while (!Queue.empty()) {p = Queue.front();//cout << p->data << " ";//输出出队结点的数据vec.push_back(p->data);Queue.pop();if (p->left != nullptr) {Queue.push(p->left);}if (p->right != nullptr) {Queue.push(p->right);}}
}// 调用层序遍历,返回vector
template<class T>
vector<T> BTree<T>::levelOrder() {cout << "获取层序遍历数组...." << endl;cout << ">>>>";vector<T> resVec;levelOrderTraversal(root, resVec);return resVec;
}

(4)复制二叉树

template<class T>
void BTree<T>::CopyTree(BTreeNode<T>* root, BTreeNode<T>*& copyRoot) {if (!root) {copyRoot = nullptr;}else {copyRoot = new BTreeNode<T>;copyRoot->data = root->data;           //复制根节点CopyTree(root->left, copyRoot->left);  //递归复制左子树CopyTree(root->right, copyRoot->right);//递归复制左子树}
}template<class T>
void BTree<T>::Copy(BTreeNode<T>*& copyRoot) {CopyTree(root, copyRoot);
}

(5)销毁二叉树

template<class T>
void BTree<T>::destroyCopyTree(BTreeNode<T>*& copyRoot) {destroyTree(copyRoot);cout << "报告,复制二叉树已销毁完毕!!!" << endl;
}// 销毁二叉树 
template<class T>
void BTree<T>::destroyTree(BTreeNode<T>* bt) {// 后序遍历删除根为subTree的子树;if (bt != nullptr) {destroyTree(bt->left);    //删除左子树destroyTree(bt->right);   //删除右子树delete bt; 			      //删除根结点}
}

(6)析构函数

// 析构函数
template<class T>
BTree<T>::~BTree<T>() {//cout << "调用析构函数" << endl;destroyTree(root);cout << "报告,这棵树已经销毁完毕!!!" << endl;
}

(7)求树的高度

// 求树高度
template<class T>
int BTree<T>::Height(BTreeNode<T>* bt) {if (bt == nullptr) return 0;else {int leftH = Height(bt->left);int rightH = Height(bt->right);return (leftH > rightH) ? leftH + 1 : rightH + 1;}
}// 获取树高度
template<class T>
int BTree<T>::getHeight() {return Height(root);
}

(8)获取结点,判断其是否在二叉树中

// 取得结点数据
template<class T>
BTreeNode<T>* BTree<T>::getData(T& item, BTreeNode<T>* cur) {if (cur == nullptr) return nullptr;if (cur->data == item) return cur;return getData(item, cur->left) != nullptr ? getData(item, cur->left) : getData(item, cur->right);
}// 判断item是否在树中
template<class T>
bool BTree<T>::Find(T& item) {if (this->getData(item, root) == nullptr) return false;else return true;

(9)计算结点个数和获取结点个数

// 计算结点个数
template<class T>
int BTree<T>::Size(BTreeNode<T>* cur) {if (cur == nullptr)return 0;elsereturn 1 + Size(cur->left) + Size(cur->right);
}// 获取结点个数
template<class T>
int BTree<T>::getSize() {return Size(root);
}

(10)二叉树判空

// 判二叉树空否?
template<class T>
bool BTree<T>::IsEmpty() {return (root == nullptr) ? true : false;
}

(11)获取根结点

// 获取根 
template<class T>
BTreeNode<T>* BTree<T>::getRoot() {if (!root) return nullptr;else {return this->root;}
}

源代码:

btree.h

#pragma once
#include <iostream>
#include <vector>
#include <queue>
using namespace std;template<class T>
struct BTreeNode {T data;BTreeNode* left, * right;BTreeNode() :data(0), left(nullptr), right(nullptr) {}BTreeNode(T val, BTreeNode<T>* leftChild = nullptr, BTreeNode<T>* rightChild = nullptr):data(val), left(leftChild), right(rightChild) {}};template<class T>
class BTree {
public:BTree() :root(nullptr) {}										      // 构造函数BTree(string str);                                                    // 重载void createTree(BTreeNode<T>*& bt, string str);                       // 创建二次树~BTree();														      // 析构函数bool IsEmpty();													      // 判二叉树空否?int Size(BTreeNode<T>* cur);                                          // 计算结点个数int getSize();                                                        // 获取结点个数BTreeNode<T>* getData(T& item, BTreeNode<T>* cur);	                  // 取得结点数据bool Find(T& item);		                                              // 判断item是否在树中int Height(BTreeNode<T>* bt);                                         // 求树高度int getHeight();                                                      // 获取树高度BTreeNode<T>* getRoot();	                                          // 取根void preOrderTraversal(BTreeNode<T>* cur, vector<int>& vec);          // 前序遍历void inOrderTraversal(BTreeNode<T>* cur, vector<int>& vec);		      // 中序遍历void postOrderTraversal(BTreeNode<T>* cur, vector<int>& vec);         // 后序遍历void levelOrderTraversal(BTreeNode<T>* cur, vector<int>& vec);        // 层序遍历vector<T> preOrder();						                          // 调用前序遍历,返回vectorvector<T> inOrder();											      // 调用中序遍历,返回vectorvector<T> postOrder();											      // 调用后序遍历,返回vectorvector<T> levelOrder();                                               // 调用层序遍历,返回vectorvoid CopyTree(BTreeNode<T>* root, BTreeNode<T>*& copyRoot);           // 二叉树复制void Copy(BTreeNode<T>*& copyRoot);                                   // 调用二叉树复制void destroyCopyTree(BTreeNode<T>*& copyRoot);                        // 销毁复制二叉树BTreeNode<T>* FindParent(BTreeNode<T>* root, BTreeNode<T>* node);     // 寻找双亲BTreeNode<T>* LeftChild(BTreeNode<T>* node) {                         //求结点 node 的左孩子return (node != nullptr) ? node->left : nullptr;}BTreeNode<T>* RightChild(BTreeNode<T>* node) {                        //求结点 node 的右孩子return (node != nullptr) ? node->right : nullptr;}protected:BTreeNode<T>* root;void destroyTree(BTreeNode<T>* node);                                // 销毁二叉树
};

btree.cpp

// 每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法!
// 1.确定递归函数的参数的返回值
// 2.确定终止条件
// 3.确定单层递归的逻辑#include "btree.h"template<class T>
BTree<T>::BTree(string str) {createTree(root, str);cout << "报告:创建一颗二叉树,完成!!!" << endl;
}template<class T>
void BTree<T>::createTree(BTreeNode<T>*& bt, string str) {static int i = 0;char ch = ' ';ch = str[i++];if (ch == '#') bt = nullptr;else {bt = new BTreeNode<T>(ch);createTree(bt->left, str);createTree(bt->right, str);}
};// 判二叉树空否?
template<class T>
bool BTree<T>::IsEmpty() {return (root == nullptr) ? true : false;
}// 计算结点个数
template<class T>
int BTree<T>::Size(BTreeNode<T>* cur) {if (cur == nullptr)return 0;elsereturn 1 + Size(cur->left) + Size(cur->right);
}// 获取结点个数
template<class T>
int BTree<T>::getSize() {return Size(root);
}// 取得结点数据
template<class T>
BTreeNode<T>* BTree<T>::getData(T& item, BTreeNode<T>* cur) {if (cur == nullptr) return nullptr;if (cur->data == item) return cur;return getData(item, cur->left) != nullptr ? getData(item, cur->left) : getData(item, cur->right);
}// 判断item是否在树中
template<class T>
bool BTree<T>::Find(T& item) {if (this->getData(item, root) == nullptr) return false;else return true;
}// 求树高度
template<class T>
int BTree<T>::Height(BTreeNode<T>* bt) {if (bt == nullptr) return 0;else {int leftH = Height(bt->left);int rightH = Height(bt->right);return (leftH > rightH) ? leftH + 1 : rightH + 1;}
}// 获取树高度
template<class T>
int BTree<T>::getHeight() {return Height(root);
}// 获取根 
template<class T>
BTreeNode<T>* BTree<T>::getRoot() {if (!root) return nullptr;else {return this->root;}
}// 析构函数
template<class T>
BTree<T>::~BTree<T>() {//cout << "调用析构函数" << endl;destroyTree(root);cout << "报告,这棵树已经销毁完毕!!!" << endl;
}// 销毁二叉树 
template<class T>
void BTree<T>::destroyTree(BTreeNode<T>* bt) {// 后序遍历删除根为subTree的子树;if (bt != nullptr) {destroyTree(bt->left);    //删除左子树destroyTree(bt->right);   //删除右子树delete bt; 			      //删除根结点}
}// 前序遍历
template<class T>
void BTree<T>::preOrderTraversal(BTreeNode<T>* cur, vector<int>& vec) {if (cur == nullptr)return;vec.push_back(cur->data);           // 中preOrderTraversal(cur->left, vec);  // 左preOrderTraversal(cur->right, vec); // 右
}// 调用前序遍历,返回vector
template<class T>
vector<T> BTree<T>::preOrder() {cout << "获取前序遍历数组...." << endl;cout << ">>>>";vector<T> resVec;preOrderTraversal(root, resVec);return resVec;
}// 中序遍历
template<class T>
void BTree<T>::inOrderTraversal(BTreeNode<T>* cur, vector<int>& vec) {if (cur == nullptr)return;inOrderTraversal(cur->left, vec);  // 左vec.push_back(cur->data);          // 中inOrderTraversal(cur->right, vec); // 右
}// 调用中序遍历,返回vector
template<class T>
vector<T> BTree<T>::inOrder() {cout << "获取中序遍历数组...." << endl;cout << ">>>>";vector<T> resVec;inOrderTraversal(root, resVec);return resVec;
}// 后序遍历
template<class T>
void BTree<T>::postOrderTraversal(BTreeNode<T>* cur, vector<int>& vec) {if (cur == nullptr)return;postOrderTraversal(cur->left, vec);  // 左postOrderTraversal(cur->right, vec); // 右vec.push_back(cur->data);            // 中
}// 调用后序遍历,返回vector
template<class T>
vector<T> BTree<T>::postOrder() {cout << "获取后序遍历数组...." << endl;cout << ">>>>";vector<T> resVec;postOrderTraversal(root, resVec);return resVec;
}// 层序遍历
template<class T>
void BTree<T>::levelOrderTraversal(BTreeNode<T>* cur, vector<int>& vec) {if (cur == nullptr) return;queue<BTreeNode<T>*> Queue;BTreeNode<T>* p;Queue.push(cur); // 根结点入队列while (!Queue.empty()) {p = Queue.front();//cout << p->data << " ";//输出出队结点的数据vec.push_back(p->data);Queue.pop();if (p->left != nullptr) {Queue.push(p->left);}if (p->right != nullptr) {Queue.push(p->right);}}
}// 调用层序遍历,返回vector
template<class T>
vector<T> BTree<T>::levelOrder() {cout << "获取层序遍历数组...." << endl;cout << ">>>>";vector<T> resVec;levelOrderTraversal(root, resVec);return resVec;
}template<class T>
void BTree<T>::CopyTree(BTreeNode<T>* root, BTreeNode<T>*& copyRoot) {if (!root) {copyRoot = nullptr;}else {copyRoot = new BTreeNode<T>;copyRoot->data = root->data;           //复制根节点CopyTree(root->left, copyRoot->left);  //递归复制左子树CopyTree(root->right, copyRoot->right);//递归复制左子树}
}template<class T>
void BTree<T>::Copy(BTreeNode<T>*& copyRoot) {CopyTree(root, copyRoot);
}template<class T>
void BTree<T>::destroyCopyTree(BTreeNode<T>*& copyRoot) {destroyTree(copyRoot);cout << "报告,复制二叉树已销毁完毕!!!" << endl;
}template<class T>
BTreeNode<T>* BTree<T>::FindParent(BTreeNode<T>* root, BTreeNode<T>* node) {if (root == nullptr) return nullptr;if (root->left == node || root->right == node)return root;	     //找到, 返回父结点地址BTreeNode <T>* p;if ((p = FindParent(root->left, node)) != nullptr)return p;	         //递归在左子树中搜索else return FindParent(root->right, node);
}

test.cpp

#include "btree.h"
#include "btree.cpp"
//#include <iostream>
//using namespace std;
int main() {cout << "-------------------------Start--------------------------" << endl;cout << "---------------------创建原始二叉树---------------------" << endl;string str = "ABD#G##E##CF###";BTree<int>* T = new BTree<int>(str);BTreeNode<int>* root = T->getRoot();cout << "这棵树有 " << T->getSize() << " 个结点" << endl;int zifu = 'G';if (T->Find(zifu)) {cout << "这棵树有 " << (char)zifu << " 结点" << endl;}else {cout << "这棵树无 " << (char)zifu << " 结点" << endl;}BTreeNode<int>* node = T->getData(zifu, root);if (node) {cout << (char)node->data << endl;BTreeNode<int>* nodeParent = T->FindParent(root, node);if (!nodeParent) {cout << "找不到父亲结点" << endl;}else {cout << "结点 " << (char)zifu << " 的父亲结点是: " << (char)nodeParent->data << " 结点" << endl;if (nodeParent->left) cout << "我的左孩子是: " << (char)nodeParent->left->data << endl;else cout << "我没有左孩子..." << endl;if (nodeParent->right) cout << "我的右孩子是: " << (char)nodeParent->right->data << endl;else cout << "我没有右孩子..." << endl;}}cout << "这棵树的高度为: " << T->getHeight() << endl;vector<int> vec = T->preOrder();for (auto i : vec) {cout << (char)i;}cout << endl;vec.clear();vec = T->inOrder();for (auto i : vec) {cout << (char)i;}cout << endl;vec.clear();vec = T->postOrder();for (auto i : vec) {cout << (char)i;}cout << endl;vec.clear();vec = T->levelOrder();for (auto i : vec) {cout << (char)i;}cout << endl;cout << "-----------------------复制二叉树-----------------------" << endl;// 复制二叉树//vector<int> vec;//BTreeNode<int>* root = T->getRoot();BTreeNode<int>* copyRoot = new BTreeNode<int>;//T->Copy(copyRoot);          // 方法一T->CopyTree(root, copyRoot);  // 方法二vec.clear();cout << "获取前序遍历数组...." << endl;cout << ">>>>";T->preOrderTraversal(copyRoot, vec);for (auto i : vec) {cout << (char)i;}cout << endl;vec.clear();cout << "获取中序遍历数组...." << endl;cout << ">>>>";T->inOrderTraversal(copyRoot, vec);for (auto i : vec) {cout << (char)i;}cout << endl;vec.clear();cout << "获取后序遍历数组...." << endl;cout << ">>>>";T->postOrderTraversal(copyRoot, vec);for (auto i : vec) {cout << (char)i;}cout << endl;vec.clear();cout << "获取层序遍历数组...." << endl;cout << ">>>>";T->levelOrderTraversal(copyRoot, vec);for (auto i : vec) {cout << (char)i;}cout << endl;cout << "---------------------销毁复制二叉树---------------------" << endl;T->destroyCopyTree(copyRoot);cout << "---------------------销毁原始二叉树---------------------" << endl;T->~BTree();cout << "--------------------------End---------------------------" << endl;return 0;
}

>>测试结果 

-------------------------Start--------------------------
---------------------创建原始二叉树---------------------
报告:创建一颗二叉树,完成!!!
这棵树有 7 个结点
这棵树有 G 结点
G
结点 G 的父亲结点是: D 结点
我没有左孩子...
我的右孩子是: G
这棵树的高度为: 4
获取前序遍历数组....
>>>>ABDGECF
获取中序遍历数组....
>>>>DGBEAFC
获取后序遍历数组....
>>>>GDEBFCA
获取层序遍历数组....
>>>>ABCDEFG
-----------------------复制二叉树-----------------------
获取前序遍历数组....
>>>>ABDGECF
获取中序遍历数组....
>>>>DGBEAFC
获取后序遍历数组....
>>>>GDEBFCA
获取层序遍历数组....
>>>>ABCDEFG
---------------------销毁复制二叉树---------------------
报告,复制二叉树已销毁完毕!!!
---------------------销毁原始二叉树---------------------
报告,这棵树已经销毁完毕!!!
--------------------------End---------------------------

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

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

相关文章

Redis_事务操作

13. redis事务操作 13.1事务简介 原子性(Atomicity) 一致性(Consistency) 隔离性(isolation) 持久性(durabiliby) ACID 13.2 Redis事务 提供了multi、exec命令来完成 第一步&#xff0c;客户端使用multi命令显式地开启事务第二步&#xff0c;客户端把事务中要执行的指令发…

Docker-使用数据卷、文件挂载进行数据存储与共享

一、前言 默认情况下&#xff0c;在Docker容器内创建的所有文件都只能在容器内部使用。容器删除后&#xff0c;数据也跟着删除&#xff0c;虽然通常我们不会删除容器&#xff0c;但是一旦宿主机发生故障&#xff0c;我们重新创建容器恢复服务&#xff0c;那么之前容器创建的文…

Transformer(一)简述(注意力机制,NLP,CV通用模型)

目录 1.Encoder 1.1简单理解Attention 1.2.什么是self-attention 1.3.怎么计算self-attention 1.4.multi-headed&#xff08;q&#xff0c;k&#xff0c;v不区分大小写&#xff09; 1.5.位置信息表达 2.Decoder&#xff08;待补充&#xff09; 3.BERT 参考文献 1.Encode…

DevOps系列文章 之 SpringBoot整合GitLab-CI实现持续集成

在企业开发过程中&#xff0c;我们开发的功能或者是修复的BUG都需要部署到服务器上去&#xff0c;而这部分部署操作又是重复且繁琐的工作&#xff0c;GitLab-CI 持续集成为我们解决了这一痛点&#xff0c;将重复部署的工作自动化&#xff0c;大大的节省了程序员们的宝贵时间。本…

Android复习(Android基础-四大组件)——Broadcast

1. 广播分类 广播的发送方式&#xff1a;标准广播、有序广播、粘性广播广播的类型&#xff1a;系统广播、本地广播 1.1 标准广播 完全异步&#xff0c;无序的广播发出后&#xff0c;所有的广播接收器几乎都会在同一时间收到消息。&#xff08;异步&#xff09;但是消息无法截…

获取部门完整路径数据

1: 获取部门数据 (基础) SELECT id, CONCAT(pid_path,id) as pid_path2,pid_path,title FROM web_department;2: 获取部门数据 (进阶, 但是是,分隔) SELECT t1.id, t1.title, CONCAT(t1.pid_path, ,, t1.id) AS pid_path,(SELECT GROUP_CONCAT(t2.title ORDER BY FIND_IN_SET…

Nginx环境搭建以及Docker环境部署

目录 Nginx环境搭建 1.首先创建Nginx的目录并进入 2.下载Nginx的安装包 可以通过FTP工具上传离线环境包&#xff0c;也可通过wget命令在线获取安装包 没有wget命令的可通过yum命令安装 3.解压Nginx的压缩包 4.下载并安装Nginx所需的依赖库和包 安装方式一 安装方式二 --- 也…

NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践

NLP文本匹配任务Text Matching [无监督训练]&#xff1a;SimCSE、ESimCSE、DiffCSE 项目实践 文本匹配多用于计算两个文本之间的相似度&#xff0c;该示例会基于 ESimCSE 实现一个无监督的文本匹配模型的训练流程。文本匹配多用于计算两段「自然文本」之间的「相似度」。 例如…

TypeScript 关于对【泛型】的定义使用解读

目录 概念导读泛型函数多个泛型参数泛型约束泛型别名泛型接口泛型类总结&#xff1a; 概念导读 泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。使用泛型 可以复用类型…

C++入门

目录 一&#xff1a;关键字 二&#xff1a;命名空间 1.引入 2.命名空间的定义 <1>:命名空间中定义变量/函数/类型 <2>:命名空间可以嵌套 <3>:同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中 3.命名空…

【设计模式】建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 介绍 …

idea入门与maven配置的一些介绍

idea入门与maven配置的一些介绍 1.确保Java和Maven已安装2.创建一个新的Maven项目3.导航到要创建项目的目录配置Maven4.配置项目的pom.xml文件5.配置其他Tomcat和设置jdk6.构建和运行项目 关于idea入门基础配置 步骤1&#xff1a;安装IntelliJ IDEA 首先&#xff0c;从IntelliJ…

【Vue-Router】命名视图

命名视图 同时 (同级) 展示多个视图&#xff0c;而不是嵌套展示&#xff0c;例如创建一个布局&#xff0c;有 sidebar (侧导航) 和 main (主内容) 两个视图&#xff0c;这个时候命名视图就派上用场了。 可以在界面中拥有多个单独命名的视图&#xff0c;而不是只有一个单独的出…

JVM内存区域划分

JVM把虚拟机的内存区域划分为方法区&#xff08;Method Area&#xff09;、堆&#xff08;Heap&#xff09;、栈&#xff08;Java Stack&#xff09;、本地方法栈&#xff08;Native Method Stack&#xff09;、和一个PC寄存器&#xff08;程序计数器&#xff0c;Progam Counti…

msvcp140.dll如何重新安装?快速安装msvcp140.dll的方法分享

msvcp140.dll是Windows操作系统的一个动态链接库文件&#xff0c;它是Microsoft Visual C Redistributable的一部分。这个文件在运行某些应用程序时非常重要。然而&#xff0c;在某些情况下&#xff0c;msvcp140.dll文件可能会损坏或遗失&#xff0c;导致应用程序无法正常运行。…

神经网络基础-神经网络补充概念-03-逻辑回归损失函数

概念 逻辑回归使用的损失函数通常是"对数损失"&#xff08;也称为"交叉熵损失"&#xff09;或"逻辑损失"。这些损失函数在训练过程中用于衡量模型预测与实际标签之间的差异&#xff0c;从而帮助模型逐步调整权重参数&#xff0c;以更好地拟合数…

堆的实现以及应用

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大家三连关注&…

Unity zSpace 开发

文章目录 1.下载 zSpace 开发环境1.1 zCore Unity Package1.2 zView Unity Package 2. 导入工程3. 发布设置4.功能实现4.1 用触控笔来实现对模型的拖拽&#xff1a; 5. 后续更新 1.下载 zSpace 开发环境 官网地址 1.1 zCore Unity Package zSpace 开发核心必须 1.2 zView …

K8S系列三:单服务部署

写在前面 本文是K8S系列第三篇&#xff0c;主要面向对K8S新手同学&#xff0c;阅读本文需要读者对K8S的基本概念&#xff0c;比如Pod、Deployment、Service、Namespace等基础概念有所了解。尚且不熟悉的同学推荐先阅读本系列的第一篇文章《K8S系列一&#xff1a;概念入门》[1]…

图解 Paxos 算法

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱写博客的嗯哼&#xff0c;爱好Java的小菜鸟 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;个人博客&#xff1a;敬请期待 &#x1f4d5;系列…