LeetCode 105. 从前序与中序遍历序列构造二叉树
题目描述
给定两个整数数组 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.递归
解题思路
前序遍历:按照「根-左子树-右子树」的顺序遍历二叉树。
中序遍历:按照「左子树-根-右子树」的顺序遍历二叉树。
class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {if(preorder.size() == 0) return nullptr;int left_size = ranges::find(inorder,preorder[0]) - inorder.begin(); //左子树的节点数vector<int> left_pre(preorder.begin() + 1,preorder.begin() + 1 + left_size); vector<int> right_pre(preorder.begin() + 1 + left_size,preorder.end());vector<int> left_in(inorder.begin(),inorder.begin()+ left_size);vector<int> right_in(inorder.begin() + 1 + left_size,inorder.end());TreeNode* left_tree = buildTree(left_pre,left_in);TreeNode* right_tree = buildTree(right_pre,right_in);return new TreeNode(preorder[0],left_tree,right_tree);}
};