当前位置: 首页 > article >正文

leetcode106 从中序与后序遍历序列构造二叉树

中序遍历的根节点左侧是左子树,右侧是右子树,后序遍历的最后一个元素为根节点。

在中序遍历中找到根节点,从而找到左右子树,知道左右子树的范围,从而后序遍历中的左右子树也就确定好了。

然后分别对左右子树用同样的方式递归构造下去。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        unordered_map<int, int> inorder_map;
        for(int i = 0; i < inorder.size(); i++){
            inorder_map[inorder[i]] = i;
        }
        return buildTreeHelper(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1, inorder_map);
    }
private:
    TreeNode* buildTreeHelper(vector<int>& inorder, int in_start, int in_end, 
                            vector<int>& postorder, int post_start, int post_end, 
                            unordered_map<int, int>& inorder_map){
        if(in_start > in_end || post_start > post_end) return nullptr;
        int rootVal = postorder[post_end];
        TreeNode* root = new TreeNode(rootVal);
        int midIndex = inorder_map[rootVal];
        int leftTreeSize = midIndex - in_start;
        root->left = buildTreeHelper(inorder, in_start, midIndex - 1, postorder, post_start, post_start + leftTreeSize - 1, inorder_map);
        root->right = buildTreeHelper(inorder, midIndex + 1, in_end, postorder, post_start + leftTreeSize, post_end - 1, inorder_map);
        return root;
    }
};


http://www.kler.cn/a/593724.html

相关文章:

  • 模型部署实战:PyTorch生产化指南
  • mac丝滑安装Windows操作系统【丝滑简单免费】
  • 【大模型-知识库之本地安装Embendding模型(BGE-M3)】
  • ROS机器人建模与仿真设计——模型控制理论
  • 【文章写作】以数字素养筑基,绘治理现代化蓝图
  • Linux笔记之Ubuntu22.04安装IBus中文输入法教程
  • 大模型——Ollama-OCR 简明教程
  • 「JavaScript深入」Socket.IO:基于 WebSocket 的实时通信库
  • 在Orin上查看CUDA cuDNN TensorRT的版本
  • 进程管理笔记1-进程线程基础知识
  • QML开发入门1--安装QT6.8和新建第一个QtQuickApplication
  • 某公司制造业研发供应链生产数字化蓝图规划P140(140页PPT)(文末有下载方式)
  • 【NGINX代理附件上传服务配置优化】
  • python-websocket压力测试
  • 【Git学习笔记】深度理解Git的分布式版本控制系统及其管理
  • 【Python办公】提取Excel嵌入图片流程(代码前期步骤)
  • MySQL InnoDB大表DDL时出现唯一键冲突
  • 知识蒸馏: Distilling the Knowledge in a Neural Network(上)
  • SAME51J20A Curiosity Nano|支持Arduino开发,适用于物联网终端、工业控制及人机交互场景
  • 微信小程序:用户拒绝小程序获取当前位置后的处理办法