已知中序后序求二叉树代码
时间: 2024-10-20 22:19:09 浏览: 15
二叉树已知中序后序求先序
5星 · 资源好评率100%
中序遍历(In-order traversal)和后序遍历(Post-order traversal)是两种常见的二叉树遍历方式。要根据这两个序列重建一棵二叉树,我们需要知道两个事实:
1. 中序遍历的顺序是左子树 -> 根节点 -> 右子树。
2. 后序遍历的顺序是左子树 -> 右子树 -> 根节点。
我们可以使用递归的方式来实现这个过程。这里是一个简单的C++代码示例:
```cpp
#include <iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 左右子树遍历结束后返回根节点的值,这是后序遍历的特点
int recoverPostorder(vector<int>& postorder) {
if (postorder.empty()) return 0;
// 当后序遍历只剩下一个元素时,它是当前根节点
return postorder.back();
}
// 递归构建二叉树
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder, int start, int end) {
if (start > end) return nullptr; // 如果范围为空,返回空指针
// 找到当前的根节点
int rootVal = recoverPostorder(postorder);
// 在中序遍历中找到对应的索引
for (int i = start; i <= end; ++i)
if (inorder[i] == rootVal)
break;
// 创建新的根节点并调整左右子树的边界
TreeNode* root = new TreeNode(rootVal);
root->left = buildTree(inorder, postorder, start, i - 1); // 左子树
root->right = buildTree(inorder, postorder, i + 1, end); // 右子树
return root;
}
// 主函数测试
void printInOrder(TreeNode* root) {
if (root == nullptr) return;
printInOrder(root->left);
cout << root->val << " ";
printInOrder(root->right);
}
int main() {
vector<int> inorder = {9, 3, 15, 20, 7};
vector<int> postorder = {9, 15, 7, 20, 3}; // 假设这是后序遍历结果
TreeNode* root = buildTree(inorder, postorder, 0, inorder.size() - 1);
printInOrder(root);
return 0;
}
```
这段代码首先定义了一个`TreeNode`结构表示二叉树节点,然后分别实现了后序遍历恢复根节点、构建完整树以及打印中序遍历结果的辅助函数。主函数里调用这些函数来生成二叉树并输出中序遍历的结果。
如果你有其他关于这个代码的问题或需要进一步的解释,请告诉我。
阅读全文