【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;
}
};