Tree4

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

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

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

例如,给出

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

返回如下的二叉树:

3
/ \
9 20
/ \
15 7

算法描述

​ 前序遍历第一个节点是二叉树中间节点,中序中从这个节点开始左右分别是左右子树,按照这个规律进行递归就可以得到最后的二叉树;

C++代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
TreeNode* buildTree(vector<int>& pre,int l1,int r1,vector<int>& ino,int l2,int r2){
if(l1>r1||l2>r2)return nullptr;
int root = pre[l1];
int mid = l2;
for(int i=l2;i<=r2;i++){
if(ino[i]==root){
mid = i ;
break;
}
}
TreeNode* s= new TreeNode(root);
s->left = buildTree(pre,l1+1,l1+mid-l2,ino,l2,mid-1);
s->right = buildTree(pre,l1+mid-l2+1,r1,ino,mid+1,r2);
return s;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return buildTree(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
}
};

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public TreeNode bulidTree2(int[] pre,int l1,int r1,int[] ino,int l2,int r2){
if(l1>r1||l2>r2)return null;
int root = pre[l1];
int mid = l2;
for(int i = l2;i<=r2;i++){
if(ino[i]==root){
mid =i;
break;
}
}
TreeNode s = new TreeNode(root);
s.left = bulidTree2(pre,l1+1,l1+mid-l2,ino,l2,mid-1);
s.right = bulidTree2(pre,l1+mid-l2+1,r1,ino,mid+1,r2);
return s;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
return bulidTree2(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
}
}