2021秋季《数据结构》_EOJ1065.树的相关操作

题目

树的双亲表示

输入格式
第一行输入n表示结点个数,接下来n行,每行输入一个index和parent,index表示当前结点编号(同时该结点的data值等于index),parent表示index这个结点的双亲结点编号。如果parent为-1,表示index为根节点。保证0<n<1000,index在[1,n]范围内,但根节点编号不一定为1.
输入例1:
3
3 2
1 2
2 -1

输出格式
输出包含7行,每一行的信息分别为:
树的前序遍历序列,用空格分隔
树的后序遍历序列,用空格分隔
树的层次遍历序列,用空格分隔
树的结点个数
输出树上所有的叶子结点,用空格分隔,按照树上的位置从左到右输出
输出树上的叶子结点个数
输出树的高度(只有根结点的树高度记为0)

思路

需要注意的是真实的测试数据并不会给n

代码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1001

struct leaf
{
	int data;
	int parent;
	vector<int> sons;
};

leaf a[MAXN];

void inOrderTraverse(leaf* a, int root)
{
	cout << root << ' ';
	for (int i = 0; i < a[root].sons.size(); i++)
	{
		inOrderTraverse(a, a[root].sons[i]);
	}
}

void postOrderTraverse(leaf* a, int root)
{
	for (int i = 0; i < a[root].sons.size(); i++)
	{
		postOrderTraverse(a, a[root].sons[i]);
	}
	cout << root << ' ';
}

void levOrderTraverse(leaf* a, int root, int idx)
{
	leaf q[MAXN],  p;
	int head = 1, tail = 2;
	if (a == NULL) return;
	for (int i = 0; i <= idx; i++)
	{
		q[i] = a[i];
	}
	while (head<tail)
	{
		p = q[head++];
		cout << p.data << ' ';
		for (int i = 0; i < p.sons.size(); i++)
		{
			q[tail++] = a[p.sons[i]];
		}
	}
}

int numCh = 0;
void getLeaf(leaf* a, int root)
{
	if (a[root].sons.size() == 0)
	{
		numCh++;
		cout << root << ' ';
		return;
	}
	for (int i = 0; i < a[root].sons.size(); i++)
	{
		getLeaf(a, a[root].sons[i]);
	}
}

int getHeight(leaf* a, int root)
{
	if (a[root].sons.size() == 0)
		return 0;
	else
	{
		int maxH = 0;
		for (int i = 0; i < a[root].sons.size(); i++)
		{
			int height = getHeight(a, a[root].sons[i]);
			if (height > maxH)
			{
				maxH = height;
			}
		}
		return maxH + 1;
	}
}

int main()
{
	int idx = 0, parent = 0;
	while (cin >> idx >> parent)
	{
		a[idx].data = idx;
		a[idx].parent = parent;
	}
	//cout << idx << endl;

	int root = 0;
	for (int i = 1; i <= idx; i++)
	{
		if (a[i].parent == -1)
			root = i;
		else
		{
			a[a[i].parent].sons.push_back(i);
		}
	}

	inOrderTraverse(a, root);
	cout << endl;
	postOrderTraverse(a, root);
	cout << endl;
	/*for (int i = 1; i <= idx; i++)
		cout << i << ' ';
	cout << endl;*/
	levOrderTraverse(a, root, idx);
	cout << endl;
	cout << idx << endl;

	getLeaf(a, root);
	cout << endl;
	cout << numCh << endl;

	cout << getHeight(a, root) << endl;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值