7-4 后序+中序序列构造二叉树

后序+中序序列构造二叉树

输入样例:

第一行输入序列长度n,第二行输入n个字符表示二叉树后序遍历的序列,第三行输入n个字符表示二叉树中序遍历的序列

9
GHDBEIFCA
GDHBAECIF

输出样例:

输出二叉树先序遍历的序列。

ABDGHCEFI

代码示例如下:

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

int n;
string in, po;
unordered_map<char, int> mp;  //预处理,降低时间复杂度

void build(string& in, string& po, int root, int l, int r)
{
    /* l,r为中序的范围
     * root为该中序范围对应二叉树的根节点在后序序列的下标 */
    if(l > r)
        return;
    int idx = mp[po[root]];
    cout << in[idx];
    build(in, po, root - r + idx - 1, l, idx - 1);
    /* 利用后序的性质来确定左子树的根节点的下标
     * 即用根节点在后序中的索引减去右子树的长度得到左子树的根 */
    build(in, po, root - 1, idx + 1, r);
    /* 右子树的根显然就是root-1了 */
}

int main()
{
    cin >> n >> po >> in;
    for(int i = 0; i < n; i++)  //预处理
        mp[in[i]] = i;
    build(in, po, po.size() - 1, 0, po.size() - 1);
    return 0;
}

 

后序遍历(Postorder Traversal)遍历(Inorder Traversal)都是用于生成二叉树的常用序列。通过这两个序列构建二叉树可以采用递归的方式。以下是使用C++实现的简单示例: 首,我们需要定义两个辅助函数,分别表示中遍历后序遍历。假设我们有一个结构体`TreeNode`表示二叉树节点,包含整数值`val`左右子节点`left``right`。 ```cpp struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 中遍历函数 TreeNode* buildTreeHelperInOrder(vector<int>& inorder, int inStart, int inEnd, vector<int>& postorder) { if (inStart > inEnd) return nullptr; // 在中遍历中找到当前节点的位置 int currPos = postorder.end() - lower_bound(postorder.begin(), postorder.end(), inorder[inStart]); // 创建根节点,并设置其值为postorder中对应的元素 TreeNode* root = new TreeNode(inorder[inStart]); root->right = buildTreeHelperInOrder(inorder, inStart + 1, currPos - 1, postorder); root->left = buildTreeHelperInOrder(inorder, currPos + 1, inEnd, postorder); return root; } // 主函数,接受两个已排的整数数组作为输入 TreeNode* buildTreeInOrder(vector<int>& inorder, vector<int>& postorder) { return buildTreeHelperInOrder(inorder, 0, inorder.size() - 1, postorder); } ``` 这个递归函数`buildTreeHelperInOrder`的核心思想是从后序遍历(postorder)中找到当前节点,然后在剩余的中遍历中寻找左子树右子树。当你遇到空指针时,说明已经到达叶子节点,返回nullptr结束递归。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_我想睡觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值