对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。
输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
8
1 -
0 -
2 7
5 -
4 6
输出样例:
4 1 5
//列出叶节点
#include <iostream>
#include <queue>
#define null -1
int N;
using namespace std;
struct node{
int element;
int left,right;
int data=0;
}p[15];
//建立一个树
int BuidTree(){
int i;
char cl,cr;
cin>>N;
int Root=-1;
int check[N];
for(i=0;i<N;i++){
p[i].element=i;
check[i]=0;
}
for(i=0;i<N;i++){
cin>>cl>>cr;
cout<<cl<<cr<<endl;
if(cl!='-'){
p[i].left=cl-'0';
check[p[i].left]=1;
cout<<"check001:"<<p[i].left<<endl;
}else{
p[i].left=null;
cout<<"check002:"<<p[i].left<<endl;
}
if(cr!='-'){
p[i].right=cr-'0';
check[p[i].right]=1;
cout<<"check003:"<<p[i].right<<endl;
}else{
p[i].right=null;
cout<<"check004:"<<p[i].right<<endl;
}
}
for(i=0;i<N;i++){
if(check[i]==0)break;
}
Root=i;
return Root;
}
//遍历整个树,并且从上到下,从左到右重新编号,层序遍历
void print(int root){
if(root!=null){
cout<<"递归的先序遍历"<<root<<" ";
print(p[root].left);
cout<<"hello kitty"<<p[root].right<<endl;
print(p[root].right);
}
cout<<"跳出递归"<<endl;
}
//用queue进行层序遍历;
void TranTree(int root,int N){
int i=0;
queue<int>q1;
q1.push(root);
while(!q1.empty()){
p[i].data=q1.front(); //记录最前面的数字,然后再pop掉,
cout<<q1.front()<<endl;
q1.pop();
//分别依次把左右两边记录到队列中
if(p[p[i].data].left!=null){
q1.push(p[p[i].data].left);
}
if(p[p[i].data].right!=null){
q1.push(p[p[i].data].right);
}
i++;
}
//p[i].data记录了层序遍历中,每个元素的顺序;
for(i=0;i<N;i++){
if(p[p[i].data].left==null){
if(p[p[i].data].right==null){
cout<<p[i].data<<endl;;
}
}
}
}
int main(){
int R1;
R1=BuidTree();
print(R1);
TranTree(R1, 8);
return 0;
}