重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例
前序遍历 preorder
= [3,9,20,15,7]
中序遍历 inorder
= [9,3,15,20,7]
3
/ \
9 20
/ \
15 7
1:递归
前序遍历:根节点->左子树->右子树;中序遍历:左子树->根节点->右子树即:前序遍历中第一个元素就是二叉树的根节点的值在中序遍历中,找到根节点的值出现的位置,记为index;中序遍历index左边是根节点的左子树,右边是根节点的右子树递归构造节点
class Solution {
public TreeNode
buildTree(int[] preorder
, int[] inorder
) {
int len
= inorder
.length
;
if(len
==0) return null
;
int rootVal
= preorder
[0];
int index
= 0;
for(int i
= 0; i
< len
; i
++) {
if(inorder
[i
]==rootVal
) {
index
= i
;
break;
}
}
TreeNode root
= new TreeNode(rootVal
);
root
.left
= buildTree(Arrays
.copyOfRange(preorder
, 1, 1 + index
), Arrays
.copyOfRange(inorder
, 0, index
));
root
.right
= buildTree(Arrays
.copyOfRange(preorder
, index
+1, len
), Arrays
.copyOfRange(inorder
, index
+1, len
));
return root
;
}
}
时间复杂度:O(n),空间复杂度:O(n)