11.10算法

发布时间 2023-11-10 21:18:10作者: 卧龙丹心

题目

从前序与中序遍历序列构造二叉树
给定两个整数数组 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]

提示:

1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder 和 inorder 均 无重复 元素
inorder 均出现在 preorder
preorder 保证 为二叉树的前序遍历序列
inorder 保证 为二叉树的中序遍历序列
相关标签

C++

答案

/**

  • 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:
    unordered_map<int,int> inorder_map;
    TreeNode *buildTreeHelper(vector&preorder,vector &inorder,int start,int end,int &pre_index){
    if(start > end){
    return nullptr;
    }
    int inorder_index = inorder_map[preorder[pre_index]];
    TreeNode *rootnode = new TreeNode(preorder[pre_index++]);

    rootnode->left = buildTreeHelper(preorder,inorder,start,inorder_index-1,pre_index);
    rootnode->right = buildTreeHelper(preorder,inorder,inorder_index+1,end,pre_index);
    return rootnode;
    }

TreeNode *buildTree(vector &preorder, vector &inorder)
{

for(int i=0;i<inorder.size();i++){
    inorder_map[inorder[i]] = i;
}
int pre_index = 0;
return buildTreeHelper(preorder,inorder,0,inorder.size()-1,pre_index);

}

};

关键:

将问题分解到单个左子树和右子树的情况,用前序遍历的方式分解树,分解为左子树和右子树,然后递归到start 》 end时此时停止为空,通过全局保存map来加速程序,不需要传很多变量