C语言给出后序遍历和中序遍历,求出层序遍历代码
时间: 2023-04-06 14:02:40 浏览: 108
C语言 树的先序,中序,后序,层序 遍历
我可以回答这个问题。首先,我们需要了解什么是后序遍历和中序遍历。后序遍历是指先遍历左子树,再遍历右子树,最后遍历根节点。中序遍历是指先遍历左子树,再遍历根节点,最后遍历右子树。层序遍历是指按照树的层次顺序遍历每个节点。
我们可以通过后序遍历和中序遍历构建出二叉树,然后再进行层序遍历。具体的步骤如下:
1. 根据后序遍历找到根节点,然后在中序遍历中找到根节点的位置,将中序遍历分为左子树和右子树两部分。
2. 根据左子树和右子树的节点数,将后序遍历也分为左子树和右子树两部分。
3. 递归地构建左子树和右子树,直到叶子节点。
4. 层序遍历二叉树,输出每个节点的值。
下面是代码实现:
```
#include <iostream>
#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 rootVal = postorder.back();
TreeNode* root = new TreeNode(rootVal);
int rootIndex = 0;
for (int i = 0; i < inorder.size(); i++) {
if (inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
vector<int> leftInorder(inorder.begin(), inorder.begin() + rootIndex);
vector<int> rightInorder(inorder.begin() + rootIndex + 1, inorder.end());
vector<int> leftPostorder(postorder.begin(), postorder.begin() + rootIndex);
vector<int> rightPostorder(postorder.begin() + rootIndex, postorder.end() - 1);
root->left = buildTree(leftInorder, leftPostorder);
root->right = buildTree(rightInorder, rightPostorder);
return root;
}
void levelOrder(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";
if (node->left != NULL) {
q.push(node->left);
}
if (node->right != NULL) {
q.push(node->right);
}
}
}
}
int main() {
vector<int> inorder = {4, 2, 5, 1, 6, 3};
vector<int> postorder = {4, 5, 2, 6, 3, 1};
TreeNode* root = buildTree(inorder, postorder);
levelOrder(root);
return 0;
}
```
这段代码可以输出二叉树的层序遍历结果。
阅读全文