题目大意
假设二叉树中的所有键都是不同的正整数。给定后序和中序遍历序列,你应该输出对应二叉树的层序遍历序列。
解题分析
- 首先根据后序和中序遍历重新生成二叉树。
- 然后层次遍历生成的二叉树即可。
- 重点为递归的公式中对数组下标的控制,代码如下
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;
}