这道题目实际上就是一个层序遍历的题,使用队列完成层序遍历
#include <iostream>
#include <vector>
#include <queue>
#define Null -1
using namespace std;
struct TreeNode{
int left = Null;
int right = Null;
};
int buildTree(vector<TreeNode>& tree, int n){
if(n <= 0)
return -1;
int index;
vector<int> check(n, 0);
for(index = 0; index < n; index++){
char left, right;
cin >> left >> right;
if(left != '-'){
tree[index].left = left - '0';
check[tree[index].left] = 1;
}
else
tree[index].left = Null;
if(right != '-'){
tree[index].right = right - '0';
check[tree[index].right] = 1;
}
else
tree[index].right = Null;
}
for(index = 0; index < n; index++){
if(check[index] == 0)
break;
}
return index;
}
void find_leaves(int root, const vector<TreeNode>& tree, vector<int>& result){
if(root == Null)
return;
queue<int> que;
que.push(root);
while(!que.empty()){
auto size = que.size();
for(int i = 0; i < size; i++){
int index = que.front();
que.pop();
if(tree[index].left == Null && tree[index].right == Null)
result.push_back(index);
if(tree[index].left != Null)
que.push(tree[index].left);
if(tree[index].right != Null)
que.push(tree[index].right);
}
}
}
int main(){
int n = 0;
cin >> n;
vector<TreeNode> tree(n);
int root = buildTree(tree, n);
vector<int> result;
find_leaves(root, tree, result);
for(int i = 0; i < result.size(); i++){
if(i < result.size() - 1)
cout << result[i] << " ";
else
cout << result[i];
}
return 0;
}