ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

浙大PTA 编程题 03-树2 List Leaves (25 分)(c++)

2021-06-27 22:04:11  阅读:204  来源: 互联网

标签:03 遍历 25 int Leaves 儿子 Right Null root


思路:

这道题的意思就是:按照层序来输出叶结点。因为是按照层序,所以遍历树中元素的方式就不同于树的同构了,因为遍历完左儿子1,不能遍历左儿子1的左儿子2,而是要遍历和左儿子1并列的右儿子1,这就需要我们记住左儿子1的父亲,才能找到右儿子1,这样用结构数组来编程太过繁琐,所以就想到了用deque容器来实现。deque容器可以在front 和back处插入数据,并可以删除front和back处的数据,太适合层序遍历了。

重点:

1.因为用户输入树的数据不是按着层序输入的,需要我们自行找到树的根结点。

2.容器deque中元素的插入和删除。d.push_back();   d.pop_front(); 从后面插入,从前面删除。

运行结果:

代码如下:

#include<iostream>
#include<deque>
using namespace std;
#define Max 10
#define Null -1
struct Tree
{
	char Left;
	char Right;
}T[Max];
int InputTree(struct Tree T[])
{
	int N;
	cin >> N;
	//创建标记,用来找根结点
	int check[Max];
	for (int i = 0; i < N; i++)
	{
		check[i] = 0;
	}

	char left, right;

	if (N != 0)
	{
		for (int i = 0; i < N; i++)
		{
			//输入左右儿子
			cin >> left >> right;

			//接收左儿子
			if (left != '-')
			{
				T[i].Left = left - '0';
				check[T[i].Left] = 1;
			}
			else
			{
				T[i].Left = Null;
			}

			//接收右儿子
			if (right != '-')
			{
				T[i].Right = right - '0';
				check[T[i].Right] = 1;
			}
			else
			{
				T[i].Right = Null;
			}
		}
	}
	else
	{
		return Null;
	}
	
	//找出根结点
	int root;
	for (int i = 0; i < N; i++)
	{
		if (check[i] == 0)
		{
			root = i;
		}
	}
	return root;
}
void PrintLeaves(int root,struct Tree T[])
{
	//输出格式要求首末没有空格
	int flag = 0;

	if (root == Null)
	{
		return;
	}

	//建立deque容器,先插入数据root
	deque<int>d;
	d.push_back(root);
	while (!d.empty())  /*循环条件就是看看容器deque什么时候为空,
		                  为空就说明整个树的元素都遍历完了,
		                  则退出循环*/
	{
		//判断d中首元素是不是叶结点,是就输出,不是,就把他的左右儿子从后面存入容器
		if (T[d[0]].Left == Null && T[d[0]].Right == Null)
		{
			if (flag == 0)
			{
				cout << d[0];
				flag++;
			}
			else
			{
				cout << " " << d[0];
			}
		}
		//存左儿子
		if (T[d[0]].Left != Null)
		{
			d.push_back(T[d[0]].Left);
		}
		//存右儿子
		if (T[d[0]].Right != Null)
		{
			d.push_back(T[d[0]].Right);
		}
		//删除首元素(因为首元素的左右儿子都存进容器了,并且也判断完了他是不是叶结点了)
		//这样,首元素的左儿子就变成了首元素
		//然后和首元素的左儿子并列的首元素的右儿子在变成首元素
		//永远都用d[0]
		d.pop_front();
	}
}
int main()
{
	int Root;
	Root = InputTree(T);
	PrintLeaves(Root,T);
	system("pause");
	return 0;
}

标签:03,遍历,25,int,Leaves,儿子,Right,Null,root
来源: https://blog.csdn.net/lzyhhhhh/article/details/118280617

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有