二叉树的概念与遍历
P4913
| #include <cstdio> |
| #include <algorithm> |
| using std::max; |
| const int N = 1e6 + 5; |
| int l[N],r[N]; |
| int height(int u) { |
| if (u==0) return 0; |
| return 1+max(height(l[u]),height(r[u])); |
| } |
| int main() |
| { |
| int n; scanf("%d",&n); |
| for (int i=1;i<=n;i++) { |
| int x,y; scanf("%d%d",&x,&y); |
| l[i]=x;r[i]=y; |
| } |
| printf("%d\n", height(1)); |
| return 0; |
| } |
二叉树遍历的意思是将一棵二叉树从根结点开始,按照指定顺序,不重复、不遗漏地访问每一个结点。在完成一些任务中,必须要访问所有结点的信息,那么就需要按照某种方式不重复、不遗漏地访问所有结点。


答案
D
P1305
| #include <cstdio> |
| const int N = 30; |
| char s[10]; |
| int l[N],r[N]; |
| void dfs(int u) { |
| if (u==0) return; |
| |
| char ch=u-1+'a'; |
| printf("%c", ch); |
| dfs(l[u]); dfs(r[u]); |
| } |
| int main() |
| { |
| int n; scanf("%d",&n); |
| int root; |
| for (int i=1;i<=n;i++) { |
| scanf("%s", s); |
| |
| int u=s[0]-'a'+1; |
| int left=(s[1]=='*' ? 0 : s[1]-'a'+1); |
| int right=(s[2]=='*' ? 0 : s[2]-'a'+1); |
| l[u]=left; r[u]=right; |
| if (i==1) root=u; |
| } |
| dfs(root); |
| return 0; |
| } |
P1827
| #include <cstdio> |
| #include <cstring> |
| const int N = 30; |
| char mid[N], pre[N]; |
| void solve(int l1,int r1,int l2,int r2) { |
| if (l1>r1 || l2>r2) return; |
| |
| |
| char root=pre[l2]; |
| |
| int pos; |
| for (int i=l1;i<=r1;i++) { |
| if (mid[i]==root) { |
| pos=i; break; |
| } |
| } |
| |
| |
| |
| |
| |
| |
| solve(l1,pos-1,l2+1,l2+(pos-l1)); |
| solve(pos+1,r1,r2-(r1-pos)+1,r2); |
| printf("%c",root); |
| } |
| int main() |
| { |
| scanf("%s%s",mid+1,pre+1); |
| int len=strlen(mid+1); |
| solve(1,len,1,len); |
| return 0; |
| } |
P1229
| #include <iostream> |
| #include <string> |
| using std::string; |
| using std::cin; |
| using std::cout; |
| using ll = long long; |
| int main() |
| { |
| string s1,s2; |
| cin>>s1>>s2; |
| ll ans=1; |
| |
| int len=s1.size(); |
| for (int i=0;i<=len-2;i++) { |
| |
| for (int j=0;j<=len-2;j++) { |
| |
| if (s2[j]==s1[i+1] && s2[j+1]==s1[i]) { |
| ans*=2; break; |
| } |
| } |
| } |
| cout<<ans<<"\n"; |
| return 0; |
| } |
| #include <cstdio> |
| #include <algorithm> |
| using std::max; |
| using std::min; |
| const int N = 300; |
| int tree[N],winner[N], len; |
| void dfs(int u) { |
| if (u>=len) return; |
| dfs(u*2); dfs(u*2+1); |
| if (tree[u*2]>tree[u*2+1]) { |
| tree[u]=tree[u*2]; |
| winner[u]=winner[u*2]; |
| } else { |
| tree[u]=tree[u*2+1]; |
| winner[u]=winner[u*2+1]; |
| } |
| } |
| int main() |
| { |
| int n; scanf("%d",&n); |
| len=1; |
| for (int i=1;i<=n;i++) len*=2; |
| for (int i=len;i<=2*len-1;i++) { |
| scanf("%d",&tree[i]); |
| winner[i]=i-len+1; |
| } |
| dfs(1); |
| printf("%d\n", tree[2]<tree[3]?winner[2]:winner[3]); |
| return 0; |
| } |
| |
如果国家个数不是 个,而是一个任意正整数,这棵树的形态是?


答案
B。前 层都是满的,第 层至少有一个结点,因此至少有 个结点。
二叉树的综合应用
P1364
| #include <cstdio> |
| #include <algorithm> |
| using std::min; |
| const int N = 105; |
| int n,ans,people; |
| int w[N],l[N],r[N],depth[N],s[N]; |
| |
| bool flag[N]; |
| void dfs(int u, int d) { |
| if (u==0) return; |
| depth[u]=d; |
| dfs(l[u],d+1); dfs(r[u],d+1); |
| s[u]=w[u]+s[l[u]]+s[r[u]]; |
| } |
| void solve(int u, int sum) { |
| if (u==0) return; |
| |
| ans=min(ans,sum); |
| |
| |
| |
| |
| |
| solve(l[u],sum-2*s[l[u]]+people); |
| solve(r[u],sum-2*s[r[u]]+people); |
| } |
| int main() |
| { |
| scanf("%d",&n); |
| for (int i=1;i<=n;i++) { |
| flag[i]=true; |
| } |
| for (int i=1;i<=n;i++) { |
| scanf("%d%d%d",&w[i],&l[i],&r[i]); |
| people+=w[i]; |
| flag[l[i]]=false; |
| flag[r[i]]=false; |
| } |
| int root; |
| for (int i=1;i<=n;i++) { |
| if (flag[i]) { |
| root=i; break; |
| } |
| } |
| |
| dfs(root,0); |
| ans=0; |
| |
| for (int i=1;i<=n;i++) ans+=w[i]*depth[i]; |
| |
| solve(root,ans); |
| printf("%d\n",ans); |
| return 0; |
| } |
从二叉树到多叉树
P5908
| #include <cstdio> |
| #include <vector> |
| using std::vector; |
| const int N = 1e5+5; |
| vector<int> tree[N]; |
| int d, ans; |
| void dfs(int u, int depth, int from) { |
| ans++; |
| if (depth==d) return; |
| |
| int len=tree[u].size(); |
| for (int i=0;i<len;i++) { |
| int v=tree[u][i]; |
| if (v!=from) { |
| dfs(v,depth+1,u); |
| } |
| } |
| } |
| int main() |
| { |
| int n; scanf("%d%d",&n,&d); |
| for (int i=1;i<=n-1;i++) { |
| int u,v; |
| scanf("%d%d",&u,&v); |
| |
| tree[u].push_back(v); |
| tree[v].push_back(u); |
| } |
| dfs(1,0,0); |
| printf("%d\n",ans-1); |
| return 0; |
| } |
P2052
| #include <cstdio> |
| #include <vector> |
| #include <cmath> |
| using std::vector; |
| using std::abs; |
| using ll = long long; |
| const int N = 1e6+5; |
| struct Edge { |
| int to,l; |
| }; |
| vector<Edge> tree[N]; |
| int s[N], n; |
| |
| ll ans; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| void dfs(int u, int from) { |
| |
| s[u]=1; |
| |
| for (Edge e : tree[u]) { |
| if (e.to!=from) { |
| |
| dfs(e.to,u); |
| |
| |
| |
| |
| ans+=1ll*e.l*abs(n-2*s[e.to]); |
| s[u]+=s[e.to]; |
| } |
| } |
| } |
| int main() |
| { |
| scanf("%d",&n); |
| for (int i=1;i<=n-1;i++) { |
| int u,v,w; |
| scanf("%d%d%d",&u,&v,&w); |
| |
| tree[u].push_back({v,w}); |
| tree[v].push_back({u,w}); |
| } |
| |
| |
| dfs(1,0); |
| printf("%lld\n",ans); |
| return 0; |
| } |
P2420
| #include <cstdio> |
| #include <vector> |
| #include <cmath> |
| using std::vector; |
| using std::abs; |
| using ll = long long; |
| const int N = 1e5+5; |
| struct Edge { |
| int v,w; |
| }; |
| vector<Edge> tree[N]; |
| int n,s[N]; |
| void dfs(int u, int from) { |
| |
| |
| for (Edge e : tree[u]) { |
| if (e.v!=from) { |
| |
| |
| s[e.v]=s[u]^e.w; |
| dfs(e.v,u); |
| } |
| } |
| } |
| int main() |
| { |
| scanf("%d",&n); |
| for (int i=1;i<=n-1;i++) { |
| int u,v,w; |
| scanf("%d%d%d",&u,&v,&w); |
| |
| tree[u].push_back({v,w}); |
| tree[v].push_back({u,w}); |
| } |
| |
| |
| dfs(1,0); |
| int m; scanf("%d",&m); |
| for (int i=1;i<=m;i++) { |
| int u,v; scanf("%d%d",&u,&v); |
| printf("%d\n",s[u]^s[v]); |
| } |
| return 0; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?