对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。
输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
输出样例:
4 1 5
总结:
这个代码写的比较笨,也相对较乱,但整个的思路还是相对清晰的。
其实想要解决这道题,要认识到:在题给的示例中,0~7却没有3,要能够看出来,3应该是这个二叉树的根。所以,第1步,要让计算机设法找到这个3,这里就八仙过海,各显神通了。只要找到就可以。接着,因为是3,也就是第4行(从0开始),便是往下3的左右子树,2和7。依次,2的左右子树为第3行(从0开始,下同)的数,7的左右子树为第8行的数。
题干说 “按从上到下、从左到右的顺序” 应该可以看出,要用到层序遍历的知识。所以在输出的过程中,采用层序遍历从上到小,从左到右。其要输出叶子节点,所以我们再加一条判断语句,只要其左右子树均为 ' - ' 输出即可。
代码段:
#include <iostream>
#include <queue>
#include <stdlib.h>
using namespace std;
typedef struct {
char lchild;
char rchild;
}Tree;
int main()
{
Tree T[15];
int N;
char index;
cin>>N;
int *flag = (int*)malloc(sizeof(int)*N);
for(int i=0;i<N;i++) //初始化flag数组均为0
{
flag[i]=0; //下面的代码的意思是如果是1表示出现,0表示未出现;针对示例,flag[3]=0,flag[0~2,4~7]=0;所以3没有出现,为根
}
for(int i=0;i<N;i++)
{
char a,b;
cin>>a>>b; //依次保存信息
if(a != '-')
{
index = a;
flag[index-'0'] = 1;
T[i].lchild = index;
}else T[i].lchild = '-';
if(b != '-')
{
index = b;
flag[index-'0'] = 1;
T[i].rchild = index;
}else T[i].rchild = '-';
}
for(int i=0;i<N;i++) //循环找到3
{
if(flag[i]==0)
{
index = i + '0';
break;
}
}
queue<char> Q; //层次遍历
Q.push(index);
while(Q.empty()==0)
{
//cout<<Q.front()<<" ";
index = Q.front();
if(T[index - '0'].lchild=='-' && T[index - '0'].rchild=='-')
cout<<index<<" ";
Q.pop();
if(T[index - '0'].lchild!='-')
{
Q.push(T[index - '0'].lchild);
}
if(T[index - '0'].rchild!='-')
{
Q.push(T[index - '0'].rchild);
}
}
return 0;
}
河北工业大学