LeetCode hot100-105从前序与中序遍历序列构造二叉树

复制代码
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.empty()||inorder.empty())  return nullptr;
        vector<int> lpre,lin,rpre,rin;
        TreeNode* ans=new TreeNode(preorder[0]);;
        int flg=0;
          // 分割中序:左子树和右子树(不含根节点)
        for(int i=0;i<inorder.size();++i){
           if(inorder[i]==preorder[0]){
            flg=i;
            break;
           }
        }
        for(int i=0;i<flg;++i){
            lin.push_back(inorder[i]);
        }
        for(int i=flg+1;i<inorder.size();++i){
            rin.push_back(inorder[i]);
        }
        // 分割前序:根据左子树的大小
        for(int i=1;i<=lin.size();++i){
                lpre.push_back(preorder[i]);
        }

        for(int i = 1 + lin.size(); i < preorder.size(); ++i) {
            rpre.push_back(preorder[i]);
        }
      
        ans->left=buildTree(lpre,lin);
        ans->right=buildTree(rpre,rin);

        return ans;
    }
};
复制代码
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if (preorder.empty() || inorder.empty()) return nullptr;
        
        // 根节点是前序遍历的第一个元素
        int rootVal = preorder[0];
        TreeNode* root = new TreeNode(rootVal);
        
        // 在中序遍历中找到根节点位置
        int rootIndex = 0;
        for (int i = 0; i < inorder.size(); ++i) {
            if (inorder[i] == rootVal) {
                rootIndex = i;
                break;
            }
        }
        
        // 分割中序遍历
        vector<int> leftInorder(inorder.begin(), inorder.begin() + rootIndex);
        vector<int> rightInorder(inorder.begin() + rootIndex + 1, inorder.end());
        
        // 分割前序遍历
        vector<int> leftPreorder(preorder.begin() + 1, 
                                 preorder.begin() + 1 + leftInorder.size());
        vector<int> rightPreorder(preorder.begin() + 1 + leftInorder.size(), 
                                  preorder.end());
        
        // 递归构建左右子树
        root->left = buildTree(leftPreorder, leftInorder);
        root->right = buildTree(rightPreorder, rightInorder);
        
        return root;
    }
};
复制代码
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return build(preorder, 0, preorder.size() - 1,
                     inorder, 0, inorder.size() - 1);
    }
    
private:
    TreeNode* build(vector<int>& preorder, int preStart, int preEnd,
                    vector<int>& inorder, int inStart, int inEnd) {
        if (preStart > preEnd || inStart > inEnd) return nullptr;
        
        TreeNode* root = new TreeNode(preorder[preStart]);
        
        // 在中序中找到根节点
        int rootIndex = inStart;
        while (inorder[rootIndex] != preorder[preStart]) rootIndex++;
        
        int leftSize = rootIndex - inStart;
        
        // 递归构建
        root->left = build(preorder, preStart + 1, preStart + leftSize,
                          inorder, inStart, rootIndex - 1);
        root->right = build(preorder, preStart + leftSize + 1, preEnd,
                           inorder, rootIndex + 1, inEnd);
        
        return root;
    }
};
相关推荐
Evand J7 分钟前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
海绵宝宝转agent1 小时前
leetCode100算法开源笔记分享
笔记·算法
写后端的胖头鱼1 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
hahaha60161 小时前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉
海绵宝宝转agent1 小时前
基于Redis ZSet+AOP+注解实现限流注解算法
数据库·redis·算法
All for pursuit.2 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青2 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq2 小时前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq2 小时前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询
the3clipse3 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc