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

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;
    }
};

相关文章:

  • Java学习笔记-XXH3哈希算法
  • Dify 项目开源大模型应用开发平台
  • deque
  • Linux基础开发工具--gdb的使用
  • 蓝桥杯青少组stema2025年3月9日scratch初级组真题——转动的图形
  • 除自身以外数组的乘积——面试经典150题(力扣)
  • 每天一道算法题-两数相加
  • C++编程语言特性
  • Android Jetpack Compose介绍
  • 238.除自身以外数组的乘积
  • 【sgHelp】自定义组件:网站、平台右下角的帮助助手、指导助理
  • app测试必须进行吗?需要进行哪些测试?
  • 混元视频与万相2.1全面对比分析
  • 嵌入式笔记 | 正点原子STM32F103ZET6 4 | 中断补充
  • 搭建个人博客教程(Hexo)
  • Django+celery+flower
  • 【文件分类助手V1.0b】支持自定义后缀分类整理及目录文档自动生成,方便大家美化管理自己的PC文件库支持Win10/11
  • 【从零开始学习计算机科学与技术】计算机网络(三)数据链路层
  • 蓝桥杯备考---》分类讨论之Fixed Points
  • 在Ubuntu20.04上交叉编译能在Windows上运行的Qt5应用
  • 两次通话、三点诉求,泽连斯基对美称愿与俄签署和平备忘录
  • 中国戏剧梅花奖终评结果公示,蓝天、朱洁静等15名演员入选
  • 国家主席习近平任免驻外大使
  • 高温最强时段来了!北方局地高温有明显极端性
  • 高飞已任南航集团党组副书记
  • 上海交大曾小勤:科技传播不应停留于知识搬运,要做科学思维的播种机