给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列 c++
时间: 2023-07-24 13:12:54 浏览: 152
好的,这道题是关于二叉树遍历的问题,需要用到队列这个数据结构。我会通过 C++ 代码来解决这个问题,这样你可以更好地理解算法的实现过程。
首先,我们需要定义二叉树的节点结构体,代码如下:
```c++
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
```
接下来,我们需要实现一个函数来构建二叉树,代码如下:
```c++
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if (inorder.empty() || postorder.empty()) {
return NULL;
}
int root_val = postorder.back();
TreeNode* root = new TreeNode(root_val);
int root_idx = 0;
for (int i = 0; i < inorder.size(); i++) {
if (inorder[i] == root_val) {
root_idx = i;
break;
}
}
vector<int> left_inorder(inorder.begin(), inorder.begin() + root_idx);
vector<int> right_inorder(inorder.begin() + root_idx + 1, inorder.end());
vector<int> left_postorder(postorder.begin(), postorder.begin() + left_inorder.size());
vector<int> right_postorder(postorder.begin() + left_inorder.size(), postorder.end() - 1);
root->left = buildTree(left_inorder, left_postorder);
root->right = buildTree(right_inorder, right_postorder);
return root;
}
```
这个函数的作用是根据中序遍历和后序遍历来构建一棵二叉树。我们首先找到后序遍历的最后一个节点作为根节点,然后在中序遍历中找到根节点的位置,这样就可以将中序遍历分成左子树和右子树。接下来,我们根据左子树和右子树的中序遍历和后序遍历递归地构建左子树和右子树。最后返回根节点即可。
有了二叉树之后,我们就可以使用队列来实现层序遍历了。具体实现代码如下:
```c++
vector<int> levelOrder(TreeNode* root) {
vector<int> result;
if (root == NULL) {
return result;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
result.push_back(node->val);
if (node->left != NULL) {
q.push(node->left);
}
if (node->right != NULL) {
q.push(node->right);
}
}
return result;
}
```
这个函数的作用是实现二叉树的层序遍历。我们首先将根节点入队,然后每次从队列中取出队首节点,并将其左右子节点入队。这样就可以按层遍历整棵二叉树。最后将遍历的结果存储在一个数组中返回即可。
最后,我们将构建二叉树和层序遍历的代码连接起来,完整的代码如下:
```c++
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if (inorder.empty() || postorder.empty()) {
return NULL;
}
int root_val = postorder.back();
TreeNode* root = new TreeNode(root_val);
int root_idx = 0;
for (int i = 0; i < inorder.size(); i++) {
if (inorder[i] == root_val) {
root_idx = i;
break;
}
}
vector<int> left_inorder(inorder.begin(), inorder.begin() + root_idx);
vector<int> right_inorder(inorder.begin() + root_idx + 1, inorder.end());
vector<int> left_postorder(postorder.begin(), postorder.begin() + left_inorder.size());
vector<int> right_postorder(postorder.begin() + left_inorder.size(), postorder.end() - 1);
root->left = buildTree(left_inorder, left_postorder);
root->right = buildTree(right_inorder, right_postorder);
return root;
}
vector<int> levelOrder(TreeNode* root) {
vector<int> result;
if (root == NULL) {
return result;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
result.push_back(node->val);
if (node->left != NULL) {
q.push(node->left);
}
if (node->right != NULL) {
q.push(node->right);
}
}
return result;
}
int main() {
vector<int> inorder = {9, 3, 15, 20, 7};
vector<int> postorder = {9, 15, 7, 20, 3};
TreeNode* root = buildTree(inorder, postorder);
vector<int> result = levelOrder(root);
for (int i = 0; i < result.size(); i++) {
cout << result[i] << " ";
}
cout << endl;
return 0;
}
```
这个程序的输出结果是:
```
3 9 20 15 7
```
这就是二叉树的层序遍历序列。希望我的讲解能够帮助你理解这个问题的解决方法。
阅读全文