2021秋季《数据结构》_EOJ1064. 树的层号表示法

题目

根据树的层号表示建树,打印树的后序遍历序列。
A
/ \
B C
/ \
D E
可以表示为(0,A) (1,B) (2,D) (2,E) (1,C)
在这里插入图片描述

思路

  • 为了依照输入唯一确定一棵树,struct中还需要加入parentchild属性
  • 可以利用cin对输入进行简化处理
  • 如果仅使用pcNode而不使用levelNode,在构建树的过程中,例如在定义pcNode* root时,需要将a[0]中的信息拷贝进root,而child为一个数组,如果使用手动拷贝,则操作较为繁琐;如果定义拷贝构造函数,则拷贝构造函数将覆盖默认构造函数,导致无法声明形如pcNode a[]的数组,所以加用一个levelNode用于存储输入的层号和数据

代码

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

struct levelNode
{
	int lev;
	char data;
};

struct pcNode
{
	int lev;
	char data;
	pcNode* child[MAXN];
	pcNode* parent;
	pcNode(levelNode a)
	{
		lev = a.lev;
		data = a.data;
		for (int i = 0; i < MAXN; i++)
			child[i] = NULL;
		parent = NULL;
	}
};

levelNode a[MAXN];

void getData()
{
	cin >> n;
	char c;
	for (int i = 0; i < n; i++)
	{
		cin >> c >> a[i].lev >> c >> a[i].data >> c;
		getchar();
	}
}

pcNode* buildTree(levelNode* a, int n)
{
	pcNode* root = new pcNode(a[0]);
	pcNode* p = root;
	for (int i = 1; i < n; i++)
	{
		pcNode* q = new pcNode(a[i]);
		while (p->lev >= q->lev)  // 找到q的parent
		{
			p = p->parent;
		}
		int j = 0;
		while (p->child[j] != NULL) j++;
		p->child[j] = q;
		q->parent = p;
		p = q;
	}
	return root;
}

void postOrderTraverse(pcNode* root)
{
	if (root)
	{
		for (int i = 0; i < MAXN; i++)
		{
			if (root->child[i])
				postOrderTraverse(root->child[i]);
		}
		cout << root->data;
	}
}

int main()
{
	getData();
	pcNode* root = buildTree(a, n);
	postOrderTraverse(root);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值