7-7 列出葉結點 (25 分)
阿新 • • 發佈:2021-12-23
點選檢視題目
#include <bits/stdc++.h> using namespace std; int n;//n個結點 int vis[10];//檢測陣列位置有沒有被遍歷過 struct btnode { int l = -1; int r = -1; } bt[10];//樹,-1代表為葉子(預設為-1) vector<int> ans[100];//關鍵可變陣列(用陣列一樣) /* *可變陣列作用:實現題目要求輸出順序 *解釋:每次函式傳入的cnt本質上是樹的深度, *而ans[cnt]自然代表第cnt深度符合條件的葉子結點。 */ void bfs(int k,int cnt)//注:不是bfs,寫習慣了 { if(bt[k].l==-1&&bt[k].r==-1) { ans[cnt].push_back(k); return; } if(bt[k].l!=-1){ bfs(bt[k].l,cnt+1); } if(bt[k].r!=-1){ bfs(bt[k].r,cnt+1); } } int main() { memset(vis, 0, sizeof vis);//重置visited陣列 cin >> n; for (int i = 0; i < n; i++) { char a; char b; cin >> a >> b; if (a != '-') { bt[i].l = a-'0'; vis[bt[i].l]=1; } if (b != '-') { bt[i].r = b-'0'; vis[bt[i].r] = 1; } } int root=0;//代表根節點 for (int i = 0; i < n; i++)//尋找根節點 { if (vis[i] == 0) { root = i; break; } } bfs(root,0); int flag=0; for(int j=0;j<n;j++) { for(int i=0;i<ans[j].size();i++) { if(flag==0) { flag=1; } else cout<<" "; cout<<ans[j][i]; } } return 0; }