随笔 - 112  文章 - 0  评论 - 0  阅读 - 1352

从前序与中序遍历序列构造二叉树(递归)

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

 

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

 

复制代码
/**
 * 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:
    map<int,int> index;
    TreeNode* myBuildTree(vector<int>& preorder, vector<int>& inorder,int preorder_left,int preorder_right,int inorder_left,int inorder_right){
        if(preorder_right-preorder_left<0) return nullptr;//先序序列已遍历完毕
        //构造当前节点
        TreeNode* node = new TreeNode(preorder[preorder_left]);
        //确定当前节点在中序序列中的位置
        int inorder_node = index[node->val];
        //确定当前节点的左子树的节点数
        int leftsize = inorder_node - inorder_left;
        //递归构造该节点的左右子树
        node->left= myBuildTree(preorder,inorder,preorder_left+1,preorder_left+leftsize,inorder_left,inorder_node-1);
        node->right= myBuildTree(preorder,inorder,preorder_left+leftsize+1,preorder_right,inorder_node+1,inorder_right); 
        return node;

    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size();
        //对inoder序列构造从值到索引的映射,以便能根据值快速找到在inorder中的索引
        for(int i=0;i<n;i++){
            index[inorder[i]] =i;
        }
        //构造二叉树
        return myBuildTree(preorder,inorder,0,n-1,0,n-1); 
    }
};
复制代码

 

posted on   _月生  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示