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

题目描述

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法1:递归

通过二叉树前序遍历,中序遍历性质可知,当前二叉树的根总在前序遍历的第一位,

通过中序遍历找到该节点的位置,在中序数组中,该节点左侧即为该节点的左子树,该节点的右侧为该节点的右子树,循环递归,则构成了一颗二叉树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
private:
vector<int> preorders;
vector<int> inorders;
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
this->preorders=preorder;
this->inorders=inorder;
int n=preorder.size();
int m=inorder.size();
if(preorder.size()==0)
return NULL;
return find(0,n-1,0,m-1);
}
TreeNode *find(int i,int ni,int j,int mj)
{
if(i>ni||j>mj)
return NULL;
int rootval=preorders[i];
int l=j;
while(l<=mj&&inorders[l]!=rootval)
{
l++;
}
TreeNode *root=new TreeNode(rootval);
root->left=find(i+1,i+l-j,j,l-1); //pre ino 区间长度要相等
root->right=find(i+l-j+1,ni,l+1,mj);
return root;
}
};