一个星期前做这道List Leaves总是不能实现层次遍历,回过头看mooc才知道是用队列实现的。
即便是我在线性结构——线性表、堆栈、队列那里做了一些练习,结果到这里还是不能正确选用模型,所以还是要多看实例,多加思考运用才行。
AC代码:
#include <iostream>
#include<string>
#define MAXSIZE 10
#define NULL -1//在c++中NULL默认值是0,和数组下界重合,替换之
using namespace std;
struct QNode {
int left, right;
};
typedef struct QNode* TreeNode;
TreeNode creattree(int n) {
TreeNode p = (TreeNode)malloc(MAXSIZE*sizeof(struct QNode));
for (int i = 0; i < n; i++)
p[i].left = p[i].right = NULL;
return p;
}
struct queue {
int* element;
int front = -1, rear = -1;//问题的特殊性决定了队列不需要判断空或满
};
queue addQ(queue Q, int n) {
if (n != NULL) {
Q.rear++;
Q.element[Q.rear] = n;
}
return Q;
}
bool Isempty(queue Q) {
return(Q.front == Q.rear);
}
queue deleteQ(queue Q) {
Q.front++;
Q.element[Q.front - 1] = NULL;
return Q;
}
void listleaf(TreeNode p,int node) {
queue q;
q.element = (int*)malloc(MAXSIZE * sizeof(int));
q=addQ(q, node);
int first = 1;
while (!Isempty(q)) {
if (p[q.element[q.front + 1]].left == NULL && p[q.element[q.front + 1]].right == NULL)//是叶节点就输出
if (first == 1) {
cout << q.element[q.front + 1];
first = 0;
}
else
cout <<" "<< q.element[q.front + 1];
q=addQ(q, p[q.element[q.front + 1]].left);
q=addQ(q, p[q.element[q.front + 1]].right);
q = deleteQ(q);
}
}
int main() {
int n,head;
cin >> n;
TreeNode p = creattree(n);//树用一个简单结构数组表示
int ifhead[10] = { 0 };//数组初始化全部为零
for (int i = 0; i < n; i++) {//建树找头节点
char left, right;
cin >> left >> right;
if (left == '-')
p[i].left = NULL;
else {
p[i].left = left - '0';
ifhead[p[i].left] = 1;
}
if (right == '-')
p[i].right = NULL;
else {
p[i].right = right - '0';
ifhead[p[i].right] = 1;
}
}
for (head = 0; head < n; head++)
if (ifhead[head] == 0)
break;
listleaf(p,head);
return 0;
}