基础实验4-2.2 List Leaves列出叶结点 (25 分)【层次遍历】

一个星期前做这道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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值