我真是个憨皮,一开始用数组直接建树,忘了会爆,RE3发才知道。然后稍微改了一下树就过了。
题意:按题目意思给出某棵树的访问序列,第一个数为根节点,后一个数如果小于等于根节点则为根节点的右孩子,否则为左孩子,然后在以孩子为根节点按以上规律建树。现在有q个询问,求从根节点出发访问某个节点的路径,如果访问的为左孩子输出‘W’,右孩子输出‘E’。
思路:模拟就完事
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,b,s[1200]; struct node { int l,r; int num; }pp[1200]; queue<string> p[1200]; void dfs(int pos,int nn) { if(pp[pos].l==-1&&pos<s[nn]) { pp[pos].l=s[nn]; p[s[nn]].push("W"); return ; } else if(pp[pos].r==-1&&pos>s[nn]) { pp[pos].r=s[nn]; p[s[nn]].push("E"); return ; } if(s[nn]>pos) { p[s[nn]].push("W"); dfs(pp[pos].l,nn); } else if(s[nn]<pos) { p[s[nn]].push("E"); dfs(pp[pos].r,nn); } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++) { while(!p[i].empty())p[i].pop(); } for(int i=0; i<n; i++) { scanf("%d",&s[i]); pp[i+1].l=pp[i+1].r=-1; } p[s[0]].push(""); for(int i=1; i<n; i++) { dfs(s[0],i); } int d; scanf("%d",&d); for(int i=0; i<d; i++) { int a; scanf("%d",&a); while(!p[a].empty()) { cout<<p[a].front(); p[a].pop(); } printf("\n"); } } return 0; }
附大佬的代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e3+5; struct Node{ Node *lc,*rc; int num; void clear(){ num=-1; lc=rc=NULL; } }pool[maxn]; Node *root,*cur; int T,n,a[maxn],q; Node *newnode() { cur->clear(); return cur++; } void build(Node *root,int value){ if(root->num==-1){ root->num=value; return; } if(value>root->num){ if(root->lc==NULL)root->lc=newnode(); build(root->lc,value); } else { if(root->rc==NULL)root->rc=newnode(); build(root->rc,value); } } inline void init(){ cur=pool; cur->clear(); root=cur++; } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); init(); root->num=a[1]; for(int i=2;i<=n;i++){ if(a[i]>a[1]){ if(root->lc==NULL)root->lc=newnode(); build(root->lc,a[i]); } else { if(root->rc==NULL) root->rc=newnode(); build(root->rc,a[i]); } } scanf("%d",&q); for(int i=1,x;i<=q;i++){ scanf("%d",&x); Node *now=root; while(x!=now->num){ if(x>now->num){ putchar('W'); now=now->lc; } else { putchar('E'); now=now->rc; } } puts(""); } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律