1. 程式人生 > 其它 >7-7 列出葉結點 (25 分)

7-7 列出葉結點 (25 分)

點選檢視題目
#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;
}