思路:首先要找到这棵树的根,输入的数据是儿子节点,在输入过程中标记所有儿子节点,最后寻找没有被标记的点即为头结点,由于需要自上而下从左到右,层次遍历符合目标,层次遍历需要辅助结构-----队列,构造一个队列,首先将头结点压入队列,弹出队首结点,将该结点不是空的儿子节点压入队列。然后循环,弹出元素,将不是空的儿子节点压入队列,若左右儿子均为空,则输出,直至队列为空。
#include<iostream>
#include<queue>
#include<string>
#include<sstream>
using namespace std;
#define MaxNum 10
#pragma warning(disable:4996)
struct Node {
int Data;
int left;
int right;
}Number[MaxNum];
typedef struct Queue {//队列结构
int QueueData[MaxNum];
int rear;
int front;
}tQueue,*pQueue;
pQueue createQueue() {//创建队列
pQueue q = (pQueue)malloc(sizeof(tQueue));
return q;
}
void addQueue(pQueue q, int item) {//添加元素
if ((q->rear + 1) % MaxNum == q->front) {
printf("Queue is full");
return;
}
q->rear = (q->rear + 1) % MaxNum;
q->QueueData[q->rear] = item;
}
int deleteQueue(pQueue q) {//删除元素
if (q->front == q->rear) {
printf("Queue is empty");
}
q->front = (q->front + 1) % MaxNum;
return q->QueueData[q->front];
}
bool isempty(pQueue q) {//检查是否为空
if (q->front == q->rear)
{
return true;
}
else {
return false;
}
}
void OrderTravel( int root,Node tree[]) {
pQueue q;
if (root == -1) return;
int bt = root,item;
q = createQueue();//创建一个空队列
addQueue(q, Number[root].Data);//将根结点压入队列
string resultStr = "";
while (!isempty(q)) {
item = deleteQueue(q);//弹出队首结点
if (Number[item].left == -1 && Number[item].right == -1) {//如果左右儿子都为空即为叶子结点
ostringstream convert;//输出流
convert << item;//压入输出流
resultStr += convert.str() + ' ';
}
if (Number[item].left != -1) {
addQueue(q, Number[item].left);//将左儿子压入队列
}
if (Number[item].right != -1) {
addQueue(q, Number[item].right);//将右儿子压入队列
}
}
resultStr.pop_back();//将字符串最后一个空格删除
cout << resultStr;
return;
}
int main()
{
int N, checked[MaxNum] = {0},root;
char left, right;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
cin >> left >> right;
Number[i].Data = i;
if (left!='-') {
Number[i].left = left - '0';
checked[Number[i].left] = 1;//标记儿子节点
}
else {
Number[i].left = -1;
}
if (right!='-') {
Number[i].right = right - '0';
checked[Number[i].left] = 1;
}
else {
Number[i].right = -1;
}
}
for (int i = 0; i < N; i++) {//寻找头结点
if (!checked[i]) {
root = i;
break;
}
}
OrderTravel(root, Number);
return 0;
}