题目描述
根据一棵树的前序遍历与中序遍历构造二叉树。
注意: 你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树:
3
/ \
9 20
/ \
15 7
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归
class Solution {
public TreeNode
buildTree(int[] preorder
, int[] inorder
) {
HashMap
<Integer,Integer> mapOfIndex
= new HashMap<>();
for(int i
= 0; i
< inorder
.length
; i
++){
mapOfIndex
.put(inorder
[i
], i
);
}
return build(preorder
, 0, preorder
.length
-1, inorder
, 0, inorder
.length
-1, mapOfIndex
);
}
public TreeNode
build(int[] preorder
, int p_left
, int p_right
, int[] inorder
, int i_left
, int i_right
, HashMap
<Integer,Integer> mapOfIndex
){
if(p_left
> p_right
) return null
;
int rootVal
= preorder
[p_left
];
TreeNode root
= new TreeNode(rootVal
);
if(p_left
== p_right
) return root
;
int rootIndex
= mapOfIndex
.get(rootVal
);
int sizeOfLeft
= rootIndex
- i_left
;
root
.left
= build(preorder
, p_left
+ 1, p_left
+ sizeOfLeft
, inorder
, i_left
, rootIndex
-1, mapOfIndex
);
root
.right
= build(preorder
, p_left
+ sizeOfLeft
+ 1, p_right
, inorder
, rootIndex
+ 1, i_right
, mapOfIndex
);
return root
;
}
}
迭代 栈