题139.pta数据结构题集-03-树2 List Leaves (25 分)
一、题目1
二、题解
#include <bits/stdc++.h>
using namespace std;
int check[10];//用于标记左右子树节点编号
struct Tree
{
int data;
int left;
int right;
}T[10];
void LevelOrderTraversal(int r)//从根节点开始层序遍历从上到下,从左到右输出叶节点
{
queue<int> q;
q.push(r);
int flag=0;
while(!q.empty())
{
int temp_r=q.front();
q.pop();
if(T[temp_r].left==-1&&T[temp_r].right==-1)//左右子树皆空为叶节点
{
if(flag)
{
putchar(' ');
}
else
{
flag=1;
}
printf("%d",T[temp_r].data);
}
if(T[temp_r].left!=-1)
{
q.push(T[temp_r].left);
}
if(T[temp_r].right!=-1)
{
q.push(T[temp_r].right);
}
}
}
int main()
{
int N;
cin>>N;
for(int i=0;i<N;i++)
{
T[i].data=i;
char left,right;
cin>>left>>right;
if(left!='-')//有左子树
{
T[i].left=left-'0';
check[T[i].left]=1;
}
else
{
T[i].left=-1;
}
if(right!='-')//有右子树
{
T[i].right=right-'0';
check[T[i].right]=1;
}
else
{
T[i].right=-1;
}
}
int r;
for(int i=0;i<N;i++)
{
if(check[i]==0)//未被标记为1的节点编号为根节点
{
r=i;
break;
}
}
LevelOrderTraversal(r);
}
三、题目2与题解
void PreorderPrintLeaves( BinTree BT )
{
if(BT==NULL)
{
return;
}
else
{
if(BT->Left==NULL&&BT->Right==NULL)
{
printf(" %c",BT->Data);
return;
}
else
{
PreorderPrintLeaves(BT->Left);
PreorderPrintLeaves(BT->Right);
}
}
}
注:需要注意到的是这里节点的data是char型,输出用%c