Loading

【leetcode】105. Construct Binary Tree from Preorder and Inorder Traversal  

  由前序和中序数组构建二叉树

  Given two integer arrays  preorder and  inorder where  preorder is the preorder traversal of a binary tree and  inorder is the inorder traversal of the same tree, construct and return the binary tree.

  python 版本:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        #这个题做过很多次 利用前序遍历和中序遍历来构建二叉树 利用递归
        if not preorder:
            return None
        root=TreeNode(preorder[0]) #中间的根节点
        mid=inorder.index(root.val)
        root.left=self.buildTree(preorder[1:mid+1],inorder[:mid])
        root.right=self.buildTree(preorder[mid+1:],inorder[mid+1:])
        return root

  cpp版本:

/**
 * 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 {
private:
    unordered_map<int,int>dp;
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        // 剑指offer 经典题目
        int mid=0; //根结点的位置 由于是前序遍历 根节点一定是从前往后找
        // hash set 存储每个节点在中序中的位置
        for(int i=0;i<inorder.size();++i){
            dp[inorder[i]]=i;
        }
        return make_tree(0,inorder.size()-1,mid,inorder,preorder);
    }
    TreeNode* make_tree(int left,int right,int &mid,vector<int>& inorder,vector<int> &preorder){
        if(left>right) return nullptr;
        int mid_num=preorder[mid];
        int divide=dp[mid_num];
        // 创建当前节点
        TreeNode* root=new TreeNode(mid_num);
        // 下一个根节点的位置
        mid++;//这个变量必须传引用
        //而且必须先构建左子树 再构建右子树 因为根节点是一级一级往前找到 根左右
        root->left=make_tree(left,divide-1,mid,inorder,preorder);
        root->right=make_tree(divide+1,right,mid,inorder,preorder);
        return root;
    }
};
posted @ 2021-11-21 17:38  aalanwyr  阅读(31)  评论(0编辑  收藏  举报