给定一棵二叉树的先序遍历序列和中序遍历序列,求解: 1、这棵树的后序遍历序列; 2、从这棵树的右侧观察该树,从根节点到叶子节点,依次输出能被观测到的节点序列。 C++代码实现
时间: 2023-12-23 15:04:55 浏览: 87
数据结构实验报告8-树-求二叉树先序、中序、后序遍历次序的第k个访问结点-实验内容与要求.docx
以下是给定先序遍历和中序遍历序列构建二叉树并求解的C++代码:
```cpp
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
// 二叉树节点的结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x): val(x), left(nullptr), right(nullptr) {}
};
// 根据先序遍历和中序遍历序列构建二叉树
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int preStart, int preEnd, int inStart, int inEnd, unordered_map<int, int>& map) {
if (preStart > preEnd || inStart > inEnd) {
return nullptr;
}
TreeNode* root = new TreeNode(preorder[preStart]); // 先序遍历序列的第一个元素为根节点
int inorderRoot = map[root->val]; // 在中序遍历序列中找到根节点的位置
int leftSubTreeSize = inorderRoot - inStart; // 左子树的大小
root->left = buildTree(preorder, inorder, preStart + 1, preStart + leftSubTreeSize, inStart, inorderRoot - 1, map); // 构建左子树
root->right = buildTree(preorder, inorder, preStart + leftSubTreeSize + 1, preEnd, inorderRoot + 1, inEnd, map); // 构建右子树
return root;
}
// 求解二叉树的后序遍历序列
void postorderTraversal(TreeNode* root, vector<int>& res) {
if (root == nullptr) {
return;
}
postorderTraversal(root->left, res);
postorderTraversal(root->right, res);
res.push_back(root->val);
}
// 从右侧观察二叉树,输出能被观测到的节点序列
void rightSideView(TreeNode* root, vector<int>& res) {
if (root == nullptr) {
return;
}
res.push_back(root->val);
if (root->right != nullptr) {
rightSideView(root->right, res);
} else {
rightSideView(root->left, res);
}
}
int main() {
// 测试样例,先序遍历序列为[1, 2, 4, 5, 3, 6, 7],中序遍历序列为[4, 2, 5, 1, 6, 3, 7]
vector<int> preorder = {1, 2, 4, 5, 3, 6, 7};
vector<int> inorder = {4, 2, 5, 1, 6, 3, 7};
unordered_map<int, int> map;
for (int i = 0; i < inorder.size(); i++) {
map[inorder[i]] = i;
}
TreeNode* root = buildTree(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1, map);
vector<int> postorder;
postorderTraversal(root, postorder);
cout << "后序遍历序列为:";
for (int i = 0; i < postorder.size(); i++) {
cout << postorder[i] << " ";
}
cout << endl;
vector<int> rightSide;
rightSideView(root, rightSide);
cout << "从右侧观察得到的节点序列为:";
for (int i = 0; i < rightSide.size(); i++) {
cout << rightSide[i] << " ";
}
cout << endl;
return 0;
}
```
输出结果为:
```
后序遍历序列为:4 5 2 6 7 3 1
从右侧观察得到的节点序列为:1 3 7
```
阅读全文