构造二叉树(已知前序遍历,中序遍历,求后序遍历)

本文介绍了如何使用C++的unordered_map建立哈希表,以及如何利用递归方法根据前序遍历和中序遍历构造二叉树。还展示了后序遍历二叉树的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

此题涉及到的<unordered_map>所建立的哈希表,没有多复杂,但对构造树方面确是很方便,

有时候掌握一些这样的额外知识,对编程大有帮助,例如vector容器,string类型等等。千里之行,始于足下。不停积累编程会更上一层楼

std::unordered_map<int,int>indexMap;

 

#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;
//节点结构体
struct TreeNode {
    char val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(char val) :val(val), left(nullptr), right(nullptr) {}
};

// 递归构造二叉树
TreeNode* buildTreeRecursive(string& preorder, string& inorder, int preStart, int inStart, int inEnd, unordered_map<int, int>& indexMap)
{
    if (preStart > preorder.size() - 1 || inStart > inEnd)
    {
        return nullptr;
    }
    //根据前序遍历的结果获得当前子树的根节点值
    char rootValue = preorder[preStart];
    TreeNode* root = new TreeNode(rootValue);
    //根据中序遍历结果获取当前子树的根节点在中序遍历的索引
    int rootIndex = indexMap[rootValue];
    //递归构造左子树和右子树
    root->left = buildTreeRecursive(preorder, inorder, preStart + 1, inStart, rootIndex - 1, indexMap);
    root->right = buildTreeRecursive(preorder, inorder, preStart + rootIndex - inStart + 1, rootIndex + 1, inEnd, indexMap);
    return root;//左递归建立完成后,进行右递归,右递归完成后,一步步回退,最后root就是整棵树的根节点
}

//建立哈希表,调用建树函数
TreeNode* builTree(string& preorder, string& inorder)
{
    //创建一个哈希表,用于快速查找中序遍历结果中节点值对应的索引
    std::unordered_map<int, int>indexMap;
    for (int i = 0; i < inorder.size(); ++i)
    {
        indexMap[inorder[i]] = i;//inedx[i]为字符串类型,隐式转换为整数类型
    }

    // 递归构造二叉树
    return buildTreeRecursive(preorder, inorder, 0, 0, inorder.size() - 1, indexMap);
}

//后序遍历二叉树
void postorderTraversal(TreeNode* root)
{
    if (root == nullptr)
        return;
    postorderTraversal(root->left);//这里的递归需要自己对照简单案例模拟一下
    postorderTraversal(root->right);//在确定当前节点的左子树和右子树已经全部访问完了,才可以访问当前节点
    cout << root->val;
}

int main()
{
    string s;
    while (getline(cin, s))
    {
        string preorder = "", inorder = "";
        int i;
        for (i = 0; s[i] != ' '; i++)//这么做是因为分开前序和中序字符串
        {
            preorder += s[i];
        }
        i++;
        for (; i < s.size();i++)
        {
            inorder += s[i];
        }
        TreeNode* root = builTree(preorder, inorder);//返回根节点
        postorderTraversal(root);
        cout << endl;
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大肥羊学校懒羊羊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值