目录

  • 并查集
    • 1250. 格子游戏【并查集判环】
    • 1252. 搭配购买【并查集 + 01背包】
    • 237. 程序自动分析【并查集的扩展】
    • 239. 奇偶游戏【不会】
    • 238. 银河英雄传说【维护距离的并查集】
  • 树状数组
    • 241. 楼兰图腾【树状数组的基本应用】
    • 242. 一个简单的整数问题【区间修改 / 单点查询】
    • 243. 一个简单的整数问题2【区间修改 / 区间查询】
    • 244. 谜一样的牛【快速求排名扩展】
  • 线段树
    • 1275. 最大数【线段树 / 维护区间最大值】
    • 245. 你能回答这些问题吗【单点修改 求区间的最大连续子段和】
    • 243. 一个简单的整数问题2【区间修改 / 区间查询】
    • 1277. 维护序列【区间乘/加 区间查询】
  • 可持续化数据结构
    • 255. 第K小数【可持续化线段树 / 主席树】
  • AC自动机
    • 1282. 搜索关键词
    • 1285. 单词

并查集

并查集的基本操作:

  • 合并两个集合
  • 查询某个元素的祖宗结点

并查集的基本应用扩展

  • 记录每个集合的大小(绑定到根节点)
  • 记录每个点到根节点的距离。(绑定到每个元素上)

1250. 格子游戏【并查集判环】


https://www.acwing.com/problem/content/description/1252/
如果合并之前,这两元素已经在集合中,那么说明有环。
1250. 格子游戏【并查集】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int p[N],n,m;
int find(int x)
{if(x!=p[x]) p[x]=find(p[x]);return p[x];
}
int get(int x,int y) {return x*n+y;}
int main(void)
{cin>>n>>m;for(int i=0;i<n*n;i++) p[i]=i;for(int i=1;i<=m;i++){int x,y;char op; cin>>x>>y>>op;x--,y--;int a=get(x,y),b;if(op=='R') b=get(x,y+1);else b=get(x+1,y);if(find(a)==find(b)){cout<<i;return 0;}p[find(a)]=find(b);}puts("draw");return 0;
}

1252. 搭配购买【并查集 + 01背包】


https://www.acwing.com/problem/content/description/1254/
1252. 搭配购买【并查集 + 01背包】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int w[N],v[N],p[N],n,m,sum,f[N];
int find(int x)
{if(x!=p[x]) p[x]=find(p[x]);return p[x];
}
int main(void)
{cin>>n>>m>>sum;for(int i=1;i<=n;i++) p[i]=i;for(int i=1;i<=n;i++) cin>>v[i]>>w[i];for(int i=1;i<=m;i++){int a,b; cin>>a>>b;if(find(a)!=find(b)){w[find(a)]+=w[find(b)];v[find(a)]+=v[find(b)];p[find(b)]=find(a);}}for(int i=1;i<=n;i++){if(p[find(i)]==i)//说明是一个根节点{for(int j=sum;j>=v[i];j--){f[j]=max(f[j],f[j-v[i]]+w[i]);}}}cout<<f[sum];return 0;
}

237. 程序自动分析【并查集的扩展】


https://www.acwing.com/problem/content/description/239/
237. 程序自动分析【并查集】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*3+10;
struct node {int a,b,c;};
int p[N],t,n,idx;
unordered_map<int,int>mp;
int get(int x)//离散化
{if(mp.count(x)==0) mp[x]=++idx;return mp[x];
}
void init(){mp.clear(),idx=0;}//初始化
int find(int x)
{if(x!=p[x]) p[x]=find(p[x]);return p[x];
}
int main(void)
{cin>>t;while(t--){init();cin>>n;vector<node>ve;for(int i=0;i<n;i++){int a,b,c; cin>>a>>b>>c;ve.push_back({get(a),get(b),c});}for(int i=1;i<=idx;i++) p[i]=i;for(int i=0;i<ve.size();i++)if(ve[i].c==1&&find(ve[i].a)!=find(ve[i].b)) p[find(ve[i].b)]=find(ve[i].a);bool flag=true;for(int i=0;i<ve.size();i++)if(!ve[i].c&&find(ve[i].a)==find(ve[i].b)) flag=false;if(flag) puts("YES");else puts("NO");}return 0;
}

239. 奇偶游戏【不会】



https://www.acwing.com/problem/content/241/

238. 银河英雄传说【维护距离的并查集】


https://www.acwing.com/problem/content/240/
238. 银河英雄传说【边带权的并查集】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*3+10;
int p[N],cnt[N],d[N],n;
int find(int x)
{if(x!=p[x]){int root=find(p[x]);d[x]+=d[p[x]];p[x]=root;}return p[x];
}
int main(void)
{for(int i=1;i<N;i++) p[i]=i,cnt[i]=1;cin>>n;while(n--){string op;int a,b; cin>>op>>a>>b;if(op=="M"){int pa=find(a),pb=find(b);d[pa]=cnt[pb];cnt[pb]+=cnt[pa];p[pa]=pb;}else{int pa=find(a),pb=find(b);if(pa==pb) cout<<max(0,abs(d[a]-d[b])-1)<<endl;else cout<<-1<<endl;}}return 0;
}

树状数组

241. 楼兰图腾【树状数组的基本应用】


https://www.acwing.com/problem/content/243/

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef long long int LL;
LL up[N],down[N],a[N],tr[N],n;
int lowbit(int x) {return x&(-x);}
int add(int x,int v) {for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v;}
LL query(int x)
{LL sum=0;for(int i=x;i;i-=lowbit(i)) sum+=tr[i];return sum;
}
int main(void)
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=n;i>=1;i--){up[i]=query(n)-query(a[i]);down[i]=query(a[i]-1);add(a[i],1);}memset(tr,0,sizeof tr);long long int ans1=0,ans2=0;for(int i=1;i<=n;i++){ans1+=(query(n)-query(a[i]))*up[i];ans2+=query(a[i]-1)*down[i];add(a[i],1);}cout<<ans1<<" "<<ans2<<endl;return 0;
}

242. 一个简单的整数问题【区间修改 / 单点查询】


https://www.acwing.com/problem/content/description/248/

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int tr[N],a[N],n,m;
int lowbit(int x){return x&(-x);}
int add(int x,int v){for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v;}
int query(int x)
{int sum=0;for(int i=x;i;i-=lowbit(i)) sum+=tr[i];return sum;
}
int main(void)
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i],add(i,a[i]-a[i-1]);while(m--){string op; cin>>op;if(op=="C"){int l,r,c; cin>>l>>r>>c;add(l,c),add(r+1,-c);}else {int x; cin>>x;cout<<query(x)<<endl;}}return 0;
}

243. 一个简单的整数问题2【区间修改 / 区间查询】


https://www.acwing.com/problem/content/description/244/
详细题解

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5+10;
LL tr1[N],tr2[N],a[N],n,m;
LL lowbit(LL x){return x&(-x);}
LL add(LL tr[],LL x,LL v){for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v;}
LL query(LL tr[],LL x)
{LL sum=0;for(int i=x;i;i-=lowbit(i)) sum+=tr[i];return sum;
}
LL sum(LL x)
{return query(tr1,x)*(x+1)-query(tr2,x);
}
int main(void)
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];LL b=a[i]-a[i-1];add(tr1,i,b);add(tr2,i,i*b);}while(m--){string op; cin>>op;if(op=="C"){LL l,r,d; cin>>l>>r>>d;add(tr1,l,d),add(tr1,r+1,-d);add(tr2,l,l*d),add(tr2,r+1,-d*(r+1));}else {LL l,r; cin>>l>>r;cout<<sum(r)-sum(l-1)<<endl;}}return 0;
}

244. 谜一样的牛【快速求排名扩展】


https://www.acwing.com/problem/content/245/
详细题解

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int tr[N],a[N],b[N],n;
int lowbit(int x) {return x&(-x);}
int add(int x,int v) {for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v;}
int query(int x)
{int sum=0;for(int i=x;i;i-=lowbit(i)) sum+=tr[i];return sum;
}
int main(void)
{cin>>n;for(int i=2;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) add(i,1);for(int i=n;i>=1;i--){int x=a[i]+1;int l=1,r=n;while(l<r){int mid=l+r>>1;if(query(mid)>=x) r=mid;else l=mid+1;}b[i]=l;add(l,-1);}for(int i=1;i<=n;i++) cout<<b[i]<<endl;return 0;
}

线段树


上图摘自: https://www.acwing.com/blog/content/372/
线段树常用的操作:

  • pushup 由子节点的信息,来计算父节点的信息
  • pushdown 由父节点更新子节点节点信息 lazytag(懒标记)
  • build 由区间建立线段树
  • modify 修改某一个点(easy)或者区间(hard)
  • query 查询某一端区间信息

线段树常见的应用场景:

  • 单点修改
  • 区间查询
  • 区间修改

相关的文章:https://www.cnblogs.com/jason2003/p/9676729.html
详细理解线段树

1275. 最大数【线段树 / 维护区间最大值】


https://www.acwing.com/problem/content/description/1277/

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
int m,p;
struct node{int l,r,v;}tr[N*4];//[l,r]区间中的最大值
void pushup(int u)//由子节点的信息,来计算父节点的信息
{tr[u].v=max(tr[u<<1].v,tr[u<<1 | 1 ].v);
}
void build(int u,int l,int r)//建树,u是根节点,l是左边界,r是右边界
{tr[u]={l,r};if(l==r) return;//叶子结点 int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
int query(int u,int l,int r)//u是根节点,查询[l,r]区间
{if(tr[u].l>=l&&tr[u].r<=r) return tr[u].v;//如果这个区间被完全包括在目标区间[l,r]里面,直接返回这个区间的值int mid=tr[u].l+tr[u].r>>1;int v=0;if(l<=mid) v=query(u<<1,l,r);//如果这个区间的左儿子和目标区间又交集,那么搜索左儿子if(r>mid) v=max(v,query(u<<1|1,l,r));如果这个区间的右儿子和目标区间又交集,那么搜索右儿子return v;
}
void modify(int u,int x,int v)//u是根,x是位置,v是添加的数
{if(tr[u].l==x&&tr[u].r==x)  tr[u].v=v;else{int mid=tr[u].l+tr[u].r>>1;if(x<=mid) modify(u<<1,x,v);else modify(u<<1|1,x,v);pushup(u);}
}
int main(void)
{int n=0,last=0;scanf("%d%d",&m,&p);build(1,1,m);int x;string op;while(m--){cin>>op>>x;if(op=="Q"){last=query(1,n-x+1,n);cout<<last<<endl;}else {modify(1,n+1,(1ll*last+x)%p);n++;}}return 0;
}

245. 你能回答这些问题吗【单点修改 求区间的最大连续子段和】


https://www.acwing.com/problem/content/246/

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int n,m;
int w[N];
struct node
{int l,r;int sum,lmax,rmax,tmax;//sum: 区间和//tmax:整个区间的最大子段和//lmax:从左端点起的向右的最大子段和//rmax:从右端点起的向左的最大子段和
}tr[N*4];
void pushup(node &u,node &l,node &r)
{u.sum=l.sum+r.sum;u.lmax=max(l.lmax,l.sum+r.lmax);u.rmax=max(r.rmax,r.sum+l.rmax);u.tmax=max(max(l.tmax,r.tmax),l.rmax+r.lmax);
}
void pushup(int u)
{pushup(tr[u],tr[u<<1],tr[u<<1 | 1]);
}
void build(int u,int l,int r)
{if(l==r) tr[u]={l,r,w[r],w[r],w[r],w[r]};else{tr[u]={l,r};int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u);}
}
void modify(int u,int x,int v)
{if(tr[u].l==x&&tr[u].r==x) tr[u]={x,x,v,v,v,v};else{int mid=tr[u].l+tr[u].r>>1;if(x<=mid) modify(u<<1,x,v);else modify(u<<1|1,x,v);pushup(u);}
}
node query(int u,int l,int r)
{if(tr[u].l>=l&&tr[u].r<=r) return tr[u];else{int mid=tr[u].l+tr[u].r>>1;if(r<=mid) return query(u<<1,l,r);else if(l>mid) return query(u<<1|1,l,r);else{auto left=query(u<<1,l,r);auto right=query(u<<1|1,l,r);node res;pushup(res,left,right);return res; }}
}
int main(void)
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>w[i];build(1,1,n);int k,x,y;while(m--){cin>>k>>x>>y;if(k==1){if(x>y) swap(x,y);printf("%d\n",query(1,x,y).tmax);}else modify(1,x,y);}return 0;
}

243. 一个简单的整数问题2【区间修改 / 区间查询】


https://www.acwing.com/problem/content/description/244/

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
int n,m;
int w[N];
struct node
{int l,r;LL sum,add;
}tr[N*4];
void pushup(int u)
{tr[u].sum=tr[u<<1].sum+tr[u<<1 | 1].sum;
}
void pushdown(int u)
{auto &root=tr[u],&left=tr[u<<1],&right=tr[u<<1 | 1];if(root.add){left.add+=root.add,left.sum+=(LL)(left.r-left.l+1)*root.add;right.add+=root.add,right.sum+=(LL)(right.r-right.l+1)*root.add;root.add=0;}
}
void build(int u,int l,int r)
{if(l==r) tr[u]={l,r,w[r],0};else{tr[u]={l,r};int mid=l+r>>1;build(u<<1,l,mid),build(u<<1 | 1,mid+1,r);pushup(u);}
}
void modify(int u,int l,int r,int d)
{if(tr[u].l>=l&&tr[u].r<=r){tr[u].sum+=(LL)(tr[u].r-tr[u].l+1)*d;tr[u].add+=d;}else//一定分裂 {pushdown(u);int mid=tr[u].l+tr[u].r>>1;if(l<=mid) modify(u<<1,l,r,d);if(r>mid) modify(u<<1 | 1,l,r,d);pushup(u);}
}
LL query(int u,int l,int r)
{if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;pushdown(u);int mid=tr[u].l+tr[u].r>>1;LL sum=0;if(l<=mid) sum=query(u<<1,l,r);if(r>mid) sum+=query(u<<1 | 1,l,r);return sum;
}
int main(void)
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>w[i];build(1,1,n);while(m--){string op; cin>>op;if(op=="Q"){int l,r; cin>>l>>r;cout<<query(1,l,r)<<endl;}else{int l,r,d; cin>>l>>r>>d;modify(1,l,r,d);}}return 0;
}

1277. 维护序列【区间乘/加 区间查询】


https://www.acwing.com/problem/content/1279/

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5+10;
int n,m,p;
int w[N];
struct node
{int l,r;int sum,add,mul;
}tr[N*4];
void pushup(int u)
{tr[u].sum=(tr[u<<1].sum+tr[u<<1 | 1].sum)%p;
}
void eval(node &t,int add,int mul)
{t.sum=((LL)t.sum*mul+(LL)(t.r-t.l+1)*add)%p;t.mul=(LL)t.mul*mul%p;t.add=((LL)t.add*mul+add)%p;
}
void pushdown(int u)
{eval(tr[u<<1],tr[u].add,tr[u].mul);eval(tr[u<<1 | 1],tr[u].add,tr[u].mul);tr[u].add=0,tr[u].mul=1;
}
void build(int u,int l,int r)
{if(l==r) tr[u]={l,r,w[r],0,1};else{tr[u]={l,r,0,0,1};int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u);}
}
void modify(int u,int l,int r,int add,int mul)
{if(tr[u].l>=l&&tr[u].r<=r) eval(tr[u],add,mul);else{pushdown(u);int mid=tr[u].l+tr[u].r>>1;if(l<=mid) modify(u<<1,l,r,add,mul);if(r>mid) modify(u<<1|1,l,r,add,mul);pushup(u);}
}
int query(int u,int l,int r)
{if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;pushdown(u);int mid=tr[u].l+tr[u].r>>1;int sum=0;if(l<=mid) sum=query(u<<1,l,r);if(r>mid) sum=(sum+query( u<< 1 | 1 ,l,r) )%p;return sum;
}
int main(void)
{cin>>n>>p;for(int i=1;i<=n;i++) cin>>w[i];build(1,1,n);cin>>m;while(m--){int op; cin>>op;if(op==1)//区间乘法{int l,r,d; cin>>l>>r>>d;modify(1,l,r,0,d);}else if(op==2)//区间加{int l,r,d; cin>>l>>r>>d;modify(1,l,r,d,1);}else//区间查询{int l,r; cin>>l>>r;cout<<query(1,l,r)<<endl;}}return 0;
}

可持续化数据结构

255. 第K小数【可持续化线段树 / 主席树】


https://www.acwing.com/problem/content/257/

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int a[N];
vector<int>nums;
struct Node
{int l,r;int cnt;
}tr[N*4+N*17];
int root[N],idx;
int find(int x)//离散化
{return lower_bound(nums.begin(),nums.end(),x)-nums.begin();
}
int build(int l,int r)
{int p=++idx;if(l==r) return p;int mid=l+r>>1;tr[p].l=build(l,mid),tr[p].r=build(mid+1,r);return p;
}
int insert(int p,int l,int r,int x)
{int q=++idx;tr[q]=tr[p];if(l==r){tr[q].cnt++;return q;}int mid=l+r>>1;if(x<=mid) tr[q].l=insert(tr[p].l,l,mid,x);else tr[q].r=insert(tr[p].r,mid+1,r,x);tr[q].cnt=tr[tr[q].l].cnt+tr[tr[q].r].cnt;return q;
}
int query(int q,int p,int l,int r,int k)
{if(l==r) return r;int cnt=tr[tr[q].l].cnt-tr[tr[p].l].cnt;int mid=l+r>>1;if(k<=cnt) return query(tr[q].l,tr[p].l,l,mid,k);else return query(tr[q].r,tr[p].r,mid+1,r,k-cnt);
}
int main(void)
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);nums.push_back(a[i]);}sort(nums.begin(),nums.end());//离散化nums.erase(unique(nums.begin(),nums.end()),nums.end());root[0]=build(0,nums.size()-1);for(int i=1;i<=n;i++)root[i]=insert(root[i-1],0,nums.size()-1,find(a[i]));while(m--){int l,r,k; scanf("%d%d%d",&l,&r,&k);printf("%d\n",nums[query(root[r],root[l-1],0,nums.size()-1,k)]);}return 0;
}

AC自动机

1282. 搜索关键词


https://www.acwing.com/problem/content/description/1284/

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10,S=55,M=1e6+10;
int n;
int tr[N*S][26],cnt[N*S],idx;
char str[M];
int q[N*S],ne[N*S];
void insert()
{int p=0;for(int i=0;str[i];i++){int t=str[i]-'a';if(!tr[p][t]) tr[p][t]=++idx;p=tr[p][t];}cnt[p]++;
}
void build()
{int hh=0,tt=-1;for(int i=0;i<26;i++)if(tr[0][i]) q[++tt]=tr[0][i];while(hh<=tt){int t=q[hh++];for(int i=0;i<26;i++){int p=tr[t][i];if(!p) tr[t][i]=tr[ne[t]][i];else{ne[p]=tr[ne[t]][i];q[++tt]=p;}}}
}
int main(void)
{int t; cin>>t;while(t--){memset(tr,0,sizeof tr);memset(cnt,0,sizeof cnt);memset(ne,0,sizeof ne);idx=0;cin>>n;for(int i=0;i<n;i++){scanf("%s",str);insert();}build();scanf("%s",str);int res=0;for(int i=0,j=0;str[i];i++){int t=str[i]-'a';j=tr[j][t];int p=j;while(p){res+=cnt[p];cnt[p]=0;p=ne[p];}}printf("%d\n",res);}return 0;
}

1285. 单词


https://www.acwing.com/problem/content/1287/

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n;
int tr[N][26],f[N],idx;
int q[N],ne[N];
char str[N];
int id[210];
void insert(int x)
{int p=0;for(int i=0;str[i];i++){int t=str[i]-'a';if(!tr[p][t]) tr[p][t]=++idx;p=tr[p][t];f[p]++;}id[x]=p;
}
void build()
{int hh=0,tt=-1;for(int i=0;i<26;i++)if(tr[0][i]) q[++tt]=tr[0][i];while(hh<=tt){int t=q[hh++];for(int i=0;i<26;i++){int &p=tr[t][i];if(!p) p=tr[ne[t]][i];else {ne[p]=tr[ne[t]][i];q[++tt]=p;}}}
}
int main(void)
{scanf("%d",&n);for(int i=0;i<n;i++){scanf("%s",str);insert(i);}build();for(int i=idx-1;i>=0;i--) f[ne[q[i]]]+=f[q[i]];for(int i=0;i<n;i++) printf("%d\n",f[id[i]]);return 0;
}

第四章 高级数据结构相关推荐

  1. AcWing提高算法课Level-3 第四章 高级数据结构

    AcWing提高算法课Level-3 第四章 高级数据结构 并查集 AcWing 1250. 格子游戏1167人打卡 AcWing 1252. 搭配购买1064人打卡 AcWing 237. 程序自动 ...

  2. AcWing算法提高课 Level-3 第四章 高级数据结构

    并查集 1250. 格子游戏 并查集解决的是连通性(无向图联通分量)和传递性(家谱关系)问题,并且可以动态的维护.抛开格子不看,任意一个图中,增加一条边形成环当且仅当这条边连接的两点已经联通,于是可以 ...

  3. java高级类型_Java第四章高级类属性一

    四.高级类属性一: 一.== 1. 基本数据类型,根据基本数据类型的值判断是否相等,相等返回true,反之返回false 注:两端数据类型可以不同,在不同的情况下,也可以返回true 2.引用数据类型 ...

  4. [单刷 APUE 系列] 第十四章——高级 I/O

    非阻塞I/O 在最前面,我们讲过IO分成带缓冲的IO和不带缓冲的IO,但是实际上,这个区别并不是很大,因为缓冲区并没有影响到实际的读写.我们知道,系统调用实际上分成两种,高速的系统调用和低速的系统调用 ...

  5. 《python程序设计教程》第四章常用数据结构课后习题

    1.从键盘输入一个正整数列表,以-1结束,分别计算列表中奇数和偶数的和. n = int(input("请输入一个正整数:")) list3 = [] while n != -1: ...

  6. matlab高级数据结构,Matlab讲义-第四章Matlab语言数据结构1-10.pdf

    Matlab讲义-第四章Matlab语言数据结构1-10.pdf 第四章第四章 Matlab语言基础语言基础 Matlab语言程序简洁.可语言程序简洁.可 读性很强而且调试十分容易.读性很强而且调试十 ...

  7. 带父节点的平衡二叉树_学习数据结构--第四章:树与二叉树(平衡二叉树)

    第四章:树与二叉树(平衡二叉树) 1.平衡二叉树 平衡二叉树:AVL,任意结点的平衡因子的绝对值不超过一. 平衡因子:左子树高度 - 右子树高度 如上图二叉树,是否是平衡二叉树? 可以把所有结点的平衡 ...

  8. c#二叉树 取叶子节点个数_数据结构第四章:树与二叉树(二叉树的概念、性质、特殊二叉树)...

    第四章:树与二叉树(二叉树的逻辑结构) 1.二叉树 二叉树是树结构的一种,故二叉树也是逻辑结构. 二叉树:二叉树是n(n≥0)个结点的有限集合. · 1)n=0时,二叉树为空; · 2)n>0时 ...

  9. 【数据结构总结】第四章:串、数组和广义表(线性结构)

    第四章:串.数组和广义表(线性结构) 提示:本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅 ...

最新文章

  1. btc勒索病毒文件恢复及数据库恢复方案
  2. 批量查询,mget语法,mget批量查询(来自学习资料,第26节)
  3. spring boot 入门-使用spring boot构建简单应用
  4. python经典算法--------冒泡排序
  5. Golang实践录:简单的代码片段
  6. 对于初学者,如何轻松学习JavaScript?
  7. 20135337——信息安全设计基础第八周学习笔记
  8. android 关闭软键盘_「安卓之父」创立的 Essential 公司宣布关闭
  9. Linux内存管理:Linux 可加载内核模块剖析:2.6 内核透视图
  10. jQuery-星级评价
  11. Atitit 开发2d游戏的技术选型attilax总结
  12. 企业IT架构转型之道(书)总结以及反思
  13. 2021漫画小说听书三合一分销平台源码+带采集+带视频教程
  14. Live Streaming Datasets--网络数据集下载
  15. 人像考勤机php数据,考勤机数据分析测试案例 - 测试人生 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  16. 智能语音机器人语音识别系统
  17. core文件如何查看和调试
  18. 帆软决策系统后台中左上角的这个logo和名字如何修改?
  19. 使用VS2015 VC++第一步 写一个hello world程序
  20. 解决plt.title()中文显示问题

热门文章

  1. 7.3 TensorFlow笔记(基础篇):加载数据之从队列中读取
  2. linux下的/dev/shm/ 以及与swap目录的区别【转】
  3. Java基础学习-Collection体系结构和迭代测试
  4. 程序员找工作那些事(一)幸存者偏差
  5. Linux下修改Swap分区大小
  6. Win8怎么查看IP地址
  7. Java设计模式(七)策略模式 模板模式
  8. easyui中tab页中js脚本无法加载的问题及解决方法
  9. (翻译)为你的MVC应用程序创建自定义视图引擎
  10. 分区表的本地索引竟然失效了——ORA-01502