问题描述:
输入每个节点的左右子节点,输出这个树的叶子节点,输出顺序为从上到下,从左到右
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
class BT{
public:
//BT()=default;
BT(int data,int left,int right,int visted ):Data(data),Left(left),Right(right),Visited(visted){}
int Data;
int Left;
int Right;
int Visited;
};
queue<BT> Q;
void BFS(vector<BT> &v, int index){
v[index].Visited = 1;
Q.push(v[index]);
int flag = 0;
while(!Q.empty()){
BT bt = Q.front();
Q.pop(); //出队
if(bt.Left!= -1)
Q.push(v[bt.Left]);
if(bt.Right!= -1)
Q.push(v[bt.Right]);
if(bt.Left==-1&&bt.Right==-1){
if(flag==0){
printf("%d",bt.Data);
flag = 1;
}
else
printf(" %d",bt.Data);
}
}
}
int main(){
int N;
cin >> N;
char c_left,c_right;
int i_left,i_right;
vector<BT> vbt;
vector<int> find_head(N,1); //初始化为1,为了寻找头结点
int head;
for(int i = 0; i!= N; ++i){
cin >> c_left >>c_right;
if(c_left=='-')
i_left = -1;
else{
find_head[c_left-'0']=0;
i_left = c_left-'0';
}
if(c_right=='-')
i_right = -1;
else{
find_head[c_right-'0']=0;
i_right = c_right-'0';
}
BT tmp(i,i_left,i_right,0);
vbt.push_back( tmp);
}
//find head
for(int j = 0; j!=N; ++j)
if(find_head[j]){
head = j;
break;
}
BFS(vbt,head);
return 0;
}
思路核心
头结点:不出现在左右节点上
叶子节点:左右子树都为空
BFS