7-7 列出叶结点 (25 分)

点击查看题目

image

#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;
}

posted @ 2021-12-23 16:32  kingwzun  阅读(310)  评论(0编辑  收藏  举报