对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶结点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。
输出格式:
在一行中按规定顺序输出叶结点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
输出样例:
4 1 5
理解题目:第一行输入N,随后N行,每行输出从0到N-1的节点的左右子树,例如:
第一行输入1 - 表示第一个节点的左子树为节点数为1的节点,右子树为空节点。
第一步完成输入
typedef struct leaf
{
int lchild=-1;
int rchild=-1;
}leaf;//设置节点,左右子树初始化为-1;
int child[max];
leaf tree[max];
cin>>N;
for(int i=0;i<N;i++)
{
char left, right;
cin>>left>>right;//先输入char型
if(left!='-')//左子树不为空
{
tree[i].lchild=left-'0';//char转化为int;
child[count++]=tree[i].lchild;
}
if(right!='-')//右子树不为空
{
tree[i].rchild=right-'0';
child[count++]=tree[i].rchild;
}
}//child[] 为所有的子树
第二步:找到根节点。
根节点为不出现在child[]中的节点,这里就不说了
第三步: 利用队列实现广度优先(bfs)。
int front=0;//仿队列,front为队头,rear为队尾;
int rear=1;
int queue[max];
queue[0]=root;//root为根节点;
while(front!=rear)//不为空
{
if(tree[queue[front]].lchild!=-1)//左子树不为空将左子树放入队列。
{
queue[rear]=tree[queue[front]].lchild;
rear++;
}
if(tree[queue[front]].rchild!=-1)
{
queue[rear]=tree[queue[front]].rchild;
rear++;
}
front++;
}
int flag=0;
for(int i=0;i<rear;i++)//输出。
{
if(tree[queue[i]].lchild==-1&&tree[queue[i]].rchild==-1)
{
if(!flag)
{
cout<<queue[i];
flag=1;
}
else cout<<" "<<queue[i];
}
}
总的代码如下:
#include<iostream>
using namespace std;
#define max 11
typedef struct leaf
{
int lchild=-1;
int rchild=-1;
}leaf;
int main()
{
int N,count=0,track[max]={0},root;
int child[max]={-1};
leaf tree[max];
int queue[max]={0};
cin>>N;
for(int i=0;i<N;i++)
{
char left,right;
cin>>left>>right;
if(left!='-')
{
tree[i].lchild=left-'0';
child[count++]=tree[i].lchild;
}
if(right!='-')
{
tree[i].rchild=right-'0';
child[count++]=tree[i].rchild;
}
}//child[] 为所有的子树
for(int i=0;i<count;i++)
{
track[child[i]]=-1;
}
for(int i=0;i<N;i++)
{
if(!track[i])
{
root=i;
break;
}
}
int front=0;
int rear=1;
queue[0]=root;
while(front!=rear)
{
if(tree[queue[front]].lchild!=-1)
{
queue[rear]=tree[queue[front]].lchild;
rear++;
}
if(tree[queue[front]].rchild!=-1)
{
queue[rear]=tree[queue[front]].rchild;
rear++;
}
front++;
}
int flag=0;
for(int i=0;i<rear;i++)
{
if(tree[queue[i]].lchild==-1&&tree[queue[i]].rchild==-1)
{
if(!flag)
{
cout<<queue[i];
flag=1;
}
else cout<<" "<<queue[i];
}
}
return 0;
}
第一次发文章有错误还请指正!!
附运行结果: