PAT| 1020 Tree Traversals(二叉树、遍历、重建)

题目大意

假设二叉树中的所有键都是不同的正整数。给定后序和中序遍历序列,你应该输出对应二叉树的层序遍历序列。

解题分析

  • 首先根据后序和中序遍历重新生成二叉树。
  • 然后层次遍历生成的二叉树即可。
  • 重点为递归的公式中对数组下标的控制,代码如下

root->left = buildTree(postorder, inorder, leftPost, leftPost + numleft-1, leftIn, index - 1);
root->right = buildTree(postorder, inorder, leftPost + numleft, rightPost - 1, index + 1, rightIn);

代码

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

struct TreeNode
{
	int val = 0;
	TreeNode* left = nullptr;
	TreeNode* right = nullptr;
};
TreeNode* buildTree(vector<int>& postorder, vector<int>& inorder,int leftPost,int rightPost, int leftIn,int rightIn) {
	if (rightPost >= leftPost) {
		//生成根结点
		TreeNode* root = new TreeNode();
		root->val = postorder[rightPost];
		int index = 0;
		for (int i = 0; i <= rightIn; i++) {
			if (inorder[i] == postorder[rightPost]) {
				index = i;//index表示根结点的位置}
				break;
			}
		}
		int numleft = index - leftIn;//左子树结点个数
		root->left = buildTree(postorder, inorder, leftPost, leftPost + numleft-1, leftIn, index - 1);
		root->right = buildTree(postorder, inorder, leftPost + numleft, rightPost - 1, index + 1, rightIn);
		return root;
	}
	else {
		return nullptr;
	}
}
void layervisit(TreeNode* root) {
	if (root == nullptr) {
		return;
	}
	else {
		queue<TreeNode*> que;
		que.push(root);
		cout << root->val;
		TreeNode* tem = que.front();
		que.pop();
		if (tem->left != nullptr)
			que.push(tem->left);
		if (tem->right != nullptr)
			que.push(tem->right);

		while (!que.empty()) {
			int size = que.size();
			for (int i = 0; i < size; i++) {
				TreeNode* tem = que.front();
				que.pop();

				cout << ' ' << tem->val;

				if (tem->left != nullptr)
					que.push(tem->left);
				if (tem->right != nullptr)
					que.push(tem->right);
			}
		}
	}
}

int main() {
	int numNode;
	//给定后序和中序 首先重建树  然后层次遍历输出
	cin >> numNode;
	vector<int> postorder(numNode);
	vector<int> inorder(numNode);
	for (int i = 0; i < numNode; i++) {
		cin >> postorder[i];
	}
	for (int i = 0; i < numNode; i++) {
		cin >> inorder[i];
	}
	TreeNode* root = new TreeNode();
	root = buildTree(postorder, inorder, 0, numNode-1, 0, numNode-1);
	layervisit(root);	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值