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

题目描述链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

解题思路:递归法。前序遍历    根  左子树   右子树       中序遍历为  左子树 根 右子树

由此我们根据前序序列获得根,然后在中序序列中定位根的位置,便可得到根的左子树

与右子树序列之后对于左子树与右子树递归的进行此操作。最终实现解题。

LeetCode C++求解代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    unordered_map<int,int>index;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        for(int i=0;i<inorder.size();++i){
            index[inorder[i]]=i;
        }
        return fun(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
    }

    TreeNode* fun(vector<int>& preorder,vector<int>& inorder,int pre_left,int pre_right,int in_left,int in_right){
                
            if(pre_left>pre_right){
                return NULL;
            }    

            int tree_root=preorder[pre_left];//树根
            int temp=index[tree_root];//中序中树根位置
            TreeNode *root=new TreeNode(tree_root);
            int size=temp-in_left;
         root->left=fun(preorder,inorder,pre_left+1,pre_left+size,in_left,temp-1);
         root->right=fun(preorder,inorder,pre_left+size+1,pre_right,temp+1,in_right);
         return root;



    }

};
原文地址:https://www.cnblogs.com/zzw-/p/13492447.html