03-树2 List Leaves

思路:首先要找到这棵树的根,输入的数据是儿子节点,在输入过程中标记所有儿子节点,最后寻找没有被标记的点即为头结点,由于需要自上而下从左到右,层次遍历符合目标,层次遍历需要辅助结构-----队列,构造一个队列,首先将头结点压入队列,弹出队首结点,将该结点不是空的儿子节点压入队列。然后循环,弹出元素,将不是空的儿子节点压入队列,若左右儿子均为空,则输出,直至队列为空。

#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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值