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

【leetcode】通过两种遍历方式构造二叉树

 分治法:先构造出当前根节点,再递归构造左子树,递归构造右子树,核心是找到左子树、右子树对应的遍历序列:先构造一个hash表存储 一个序列中每个节点的索引,再通过另外一个序列计算出左子树、右子树对应的遍历序列的长度

class Solution {
public:
    unordered_map <int,int> idx;
    TreeNode* tree(vector<int>& preorder, vector<int>& inorder,int preleft,int preright,int inleft,int inright)
    {
        if(preleft > preright)
            return NULL;
        TreeNode* root=new TreeNode(preorder[preleft]);
        int root_index=idx[preorder[preleft]];
        int sub_left_tree_size=root_index-inleft;
        root->left=tree(preorder, inorder,preleft+1,preleft+sub_left_tree_size,inleft,root_index-1);
        root->right=tree(preorder, inorder,preleft+sub_left_tree_size+1,preright,root_index+1,inright);
        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        for(int i=0;i<inorder.size();i++)
            idx[inorder[i]]=i;
        return tree(preorder,inorder,0,inorder.size()-1,0,inorder.size()-1);
    }
};

class Solution {
public:
    unordered_map <int,int> index;
    TreeNode* mytree(vector<int>& inorder, vector<int>& postorder, int inorder_left,int inorder_right,int postorder_left,int postorder_right)
    {
        if(postorder_left>postorder_right)
            return NULL;
        TreeNode* root=new TreeNode(postorder[postorder_right]);
        int root_idx=index[postorder[postorder_right]];
        int sub_left_tree_num=root_idx-inorder_left;
        root->left=mytree(inorder,postorder,inorder_left,root_idx-1,postorder_left,postorder_left+sub_left_tree_num-1);
        root->right=mytree(inorder,postorder,root_idx+1,inorder_right,postorder_left+sub_left_tree_num,postorder_right-1);
        return root;    
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        int n=inorder.size();
        for(int i=0;i<inorder.size();i++)
            index[inorder[i]]=i;
        return mytree(inorder,postorder,0,n-1,0,n-1);
    }
};

 

class Solution {
public:
    unordered_map <int,int> index;
    TreeNode* mytree(vector<int>& preorder, vector<int>& postorder,int preorder_left,int preorder_right,int postorder_left,int postorder_right)
    {
        if(preorder_left > preorder_right)
            return NULL;
        TreeNode* root=new TreeNode(preorder[preorder_left]);
        if(preorder_left==preorder_right)
            return root;
        int root_left_idx=index[preorder[preorder_left+1]];
        int sub_left_tree_num=root_left_idx-postorder_left+1; //注意左子树的node数量计算方式
        root->left=mytree(preorder,postorder,preorder_left+1,preorder_left+sub_left_tree_num,postorder_left,postorder_left+sub_left_tree_num-1);
        root->right=mytree(preorder,postorder,preorder_left+sub_left_tree_num+1,preorder_right,postorder_left+sub_left_tree_num,postorder_right-1);
        return root;

    }
    TreeNode* constructFromPrePost(vector<int>& preorder, vector<int>& postorder) {
        int n=postorder.size();
        for(int i=0;i<n;i++)
            index[postorder[i]]=i;
        return mytree(preorder,postorder,0,n-1,0,n-1);
    }

};

 

http://www.dtcms.com/a/100019.html

相关文章:

  • 前端页面缓存问题
  • opencv之指纹验证
  • spring-security原理与应用系列:securityFilterChainBuilders
  • 职测-言语理解与表达
  • SD-WAN组网方案
  • pycharm相对路径引用方法
  • C++ 多态:面向对象编程的核心概念(一)
  • Android Product Flavors 深度解析与最佳实践:构建多版本应用的全方位指南
  • Redis的补充和RESP
  • 【工具】BioPred一个用于精准医疗中生物标志物分析的 R 软件包
  • C# StreamReader/StreamWriter 使用详解
  • 什么是 RBAC 权限模型?
  • jmeter web压力测试 压测
  • Android学习总结之算法篇三(打家劫舍)
  • 蓝桥杯—最小公倍数
  • Linux系统之dump命令的基本使用
  • Linux系统禁用swap
  • Xenium | 细胞邻域(Cellular Neighborhood)分析(fixed radius)
  • Spring AI MCP Server + Cline 快速搭建一个数据库 ChatBi 助手
  • QML编程中的性能优化二
  • C语言指针2
  • 2024蓝桥杯省赛C/C++大学B组 题解
  • [物联网iot]对比WIFI、MQTT、TCP、UDP通信协议
  • S32K144的SDK库中两种时钟初始化的区别(二)
  • MSTP和链路聚合
  • Nginx—nginx.conf 配置结构详解
  • Linux进程管理之进程间通信的相关知识(映射、管道(Pipe)通信、命名管道(FIFO)、消息队列、信号量、信号)
  • ctfshow WEB web8
  • 【Docker】Dockerfile 优化工具 hadolint
  • 普通人使用AI心得