给定树的前序+中序遍历,按层输出

给定树的前序+中序遍历,按层输出

首先根据题目要求可以给出程序主函数的框架。题目要求如下:

  • 输入:第一行输入整数n,表示树所有节点的个数。接下来两行分别为树前序和中序遍历的结果。
  • 输出:按照树的按层遍历输出。
  • 处理:由前序+中序建树
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

struct Node {
	int data;
	struct Node* left;
	struct Node* right;
	Node(const int dt): data(dt), left(NULL), right(NULL){}
};
vector<Node> front; // 前序遍历结果
vector<Node> mid;	// 中序遍历结果
struct Node* root;	// 根节点
int n;				// 树中节点个数
int j;				// 前序遍历vector索引

int main() {
	// input
	cin >> n;
	for (int i = 0; i < n; i++) {
		int d;
		cin >> d;
		Node n = Node(d);
		front.push_back(n);
	}
	for (int i = 0; i < n; i++) {
		int d;
		cin >> d;
		Node n = Node(d);
		mid.push_back(n);
	}
	// body
	j = 0;
	root = build(0, n - 1);
	// output
	bfs(root);
	return 0;
}

该题属于抽象的数据结构问题,关键在于找到树的递归结构。**前序遍历顺序遍历可以将中序遍历划分为三部分:左子树、节点、右子树。**再将节点与左右子树的关系建立起来就完成了树的建立。

Node* build(int left, int right) {	
	Node* node = &front[j];	// 中间节点
	if (left > right) {
		return NULL;
	}
	else if (left == right) {
		j++;
		return node;
	}
	for (int i = left; i <= right; i++) {
		if (mid[i].data == node->data) {
			j++;
			Node* ln = build(left, i - 1);		
			Node* rn = build(i + 1, right);
			node->left = ln;	//	建立与左子树联系
			node->right = rn;	//	建立与右子树联系
		}
	}
	return node;
}

然后整一个bfs板子输出

void bfs(Node* root) {
	queue<Node> level;
	level.push(*root);
	while (level.size() != 0) {
		Node node = level.front();
		cout << node.data << " ";
		level.pop();
		if (node.left != NULL) {
			level.push(*node.left);
		}
		if (node.right != NULL) {
			level.push(*node.right);
		}
	}
	cout << endl;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值