C++典型实现补充

This commit is contained in:
Estom
2021-09-03 06:42:58 +08:00
parent 2d9a1a3b53
commit 4922bbf1eb
18 changed files with 719 additions and 11 deletions

View File

@@ -0,0 +1,161 @@
//二叉树的链表实现
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;//左子树
TreeNode* right;//右子树
TreeNode* parent;//可以不用
};
class BinaryTree{
//TreeNode* root;//二叉树的根节点
//vector<int> tree;//二叉树的数组表示-1表示不存在的值
public:
// 创建二叉树
void build(TreeNode* &node,vector<int> &vec,int i){
if(i>vec.size() || vec[i]<0){
return ;
}
node =new TreeNode();
node->val = vec[i];
build(node->left,vec,2*i+1);
build(node->right,vec,2*i+2);
return;
}
//可视化二叉树
void display(TreeNode*node){
queue<TreeNode*> que;
que.push(node);
int i=1;
int j=0;
TreeNode* temp;
while(!que.empty()){
if(que.front()==nullptr){
que.pop();
cout<<"\t";
continue;
}
temp=que.front();
que.pop();
cout<<temp->val<<"\t";
que.push(temp->left);
que.push(temp->right);
j++;
if(j==i){
j=0;
i=2*i;
cout<<endl;
}
}
}
//处理节点值
void process(TreeNode * node){
cout<<node->val<<" ";
}
//前序遍历
void pre_order(TreeNode*node){
if(node == nullptr){
return;
}
process(node);
pre_order(node->left);
pre_order(node->right);
return;
}
//中序遍历
void mid_order(TreeNode*node){
if(node == nullptr){
return;
}
mid_order(node->left);
process(node);
mid_order(node->right);
return;
}
//后续遍历
void lst_order(TreeNode* node){
if(node == nullptr){
return;
}
lst_order(node->left);
lst_order(node->right);
process(node);
}
// 层序遍历
void layer_order(TreeNode*node){
queue<TreeNode*> que;
que.push(node);
while(!que.empty()){
if(que.front()==nullptr){
continue;
}
process(que.front());
que.push(que.front()->left);
que.push(que.front()->right);
que.pop();
}
}
//重建二叉树-前中
/*
* pre 前序遍历的数组
* mid 中序遍历的数组
* root 前序遍历中的第一个数的坐标。也就是说,该子树的根节点。
* beg2 中序遍历的起始位置。
* end2 中序遍历的结束位置。
* 问题分析:二叉树遍历问题,递归与分治的思想。创建一个树,可以分解为创建左子树和右子树两个子问题。问题的规模缩小。具有最优子结构性质,每一个子问题解法一致。子问题最终可以合并为问题的解。各个子问题相互独立。
* 选择策略:使用链表数据结构存储结果。采用递归思想递归创建。
* 算法技术:递归技术。算法流程,设计输入参数,界定本层处理范围。设计返回值即提供给上层的值。确定递归结构,分别调用左子树和右子树。确定递归的终止条件。确定递归前和递归后需要处理的内容。
* 正确性证明。
*/
TreeNode* rebuild(vector<int> pre,vector<int> mid,int root,int beg2,int end2){
if(end2<beg2){
return nullptr;
}
int i=0;
TreeNode* node= new TreeNode();
node->val=pre[root];
for(i=beg2;i<=end2;i++){
if(mid[i]==pre[root]){
break;
}
}
int dis = i-beg2;//左树的长度
node->left=rebuild(pre,mid,root+1,beg2,beg2+dis-1);
node->right=rebuild(pre,mid,root+dis+1,beg2+dis+1,end2);
return node;
}
TreeNode* rebuild2();
//重建二叉树-中后
};
int main(){
//数组表示的树
vector<int> vec{9,8,7,6,-1,4,3};
TreeNode n;
TreeNode* node=&n;
BinaryTree tree;
// tree.build(node,vec,0);
// tree.display(node);
// cout<<endl;
// tree.pre_order(node);
// cout<<endl;
// tree.mid_order(node);
// cout<<endl;
// tree.lst_order(node);
// 数组表示的前序遍历和后续遍历
vector<int> pre{3,9,20,15,7};
vector<int> mid{9,3,15,20,7};
TreeNode* node2 = tree.rebuild(pre,mid,0,0,mid.size()-1);
tree.display(node2);
return 0;
}

98
code_segment/test.cpp Normal file
View File

@@ -0,0 +1,98 @@
#include <iostream>
#include <vector>
#include <map>
using namespace std;
struct ListNode{
ListNode(int a){
val = a;
}
ListNode* pre;
ListNode* next;
int val;
};
class Data{
public:
ListNode* head;
ListNode* end;
map<int,ListNode*> m;
int size;
Data(){
head = new ListNode(-1);
end = head;
size=0;
}
void set(int a){
ListNode* temp;
if(size==4){
temp = end;
end = end->pre;
m.erase(temp->val);
delete temp;
size--;
}
ListNode* n = new ListNode(a);
m[a]=n;
if(size==0){
head->next =n;
n->pre=head;
end = n;
size=1;
}
else{
temp = head->next;
head->next = n;
n->pre = head;
n->next = temp;
temp->pre = n;
size++;
}
}
ListNode* get(int a){
ListNode* temp = m[a];
if(temp==head->next){
return temp;
}
if(temp==end){
end = end->pre;
}
temp->pre->next = temp->next;
temp->next->pre = temp->pre;
ListNode* n = head->next;
temp->next = n;
n->pre = temp;
head->next = temp;
temp->pre = head;
return temp;
}
ListNode* get(){
return head->next;
}
~Data(){
ListNode* temp=head;
while(temp!=nullptr){
ListNode* n = temp;
delete n;
temp=temp->next;
}
}
};
int main() {
Data data;
data.set(1);
cout<<data.get()->val<<endl;
data.set(2);
data.set(3);
ListNode* temp = data.get(2);
cout<<temp->val<<endl;
temp = data.get();
cout<<temp->val<<endl;
cout << "Hello World!" << endl;
}

29
code_segment/test2.cpp Normal file
View File

@@ -0,0 +1,29 @@
#include <iostream>
#include <iomanip>
#include <vector>
#include <map>
using namespace std;
int main()
{
vector<int> vec{1,2,3,4,5};
auto beg = vec.begin();
auto temp = beg+2;
cout<<boolalpha<<(temp>beg)<<endl;
cout<<*temp<<endl;
map<int,int> m;
m[1]=1;
m[2]=2;
m[3]=3;
cout<<"map:"<<endl;
for(auto beg1 = m.begin();beg1<m.end();beg1++){
cout<<(beg1->second)<<endl;
}
auto iter = m.begin();
auto temp2 = ++iter;
// cout<<(iter
// m.end())<<endl;
cout<<temp2->second<<endl;
return 0;
}

View File

@@ -0,0 +1,31 @@
#include<iostream>
#include<sstream>
#include<vector>
#include<algorithm>
using namespace std;
/*
输入例子1:
a,c,bb
f,dddd
nowcoder
*/
int main(){
string m = "a,c,bb\nf,dddd\nnowcoder";
auto cin=stringstream(m);
string s,t;
while(getline(cin,s)){
vector<string> vec;
auto ss = stringstream(s);
while(getline(ss,t,',')){
vec.push_back(t);
}
sort(vec.begin(),vec.end());
for(int i=0;i<vec.size();i++){
cout<<vec[i];
if(i!=vec.size()-1)cout<<",";
}
cout<<endl;
}
return 0;
}

View File

@@ -0,0 +1,35 @@
#include<iostream>
#include<sstream>
using namespace std;
/*
输入描述:
输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
输入例子1:
2
4 1 2 3 4
5 1 2 3 4 5
*/
int main(){
string s="2 4 1 2 3 4 5 1 2 3 4 5";
auto cin=stringstream(s);
int t,n,a;
cin>>t;
while(t--){
cin>>n;
int sum=0;
while(n--){
cin>>a;
sum+=a;
}
cout<<sum;
}
return 0;
}