根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
思路:
①前序遍历的第一个节点为根结点
②根据根结点在中序遍历中的位置,划分左右子树
③确定左右子树在前序遍历和中序遍历中的范围界限
④递归执行
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length == 0){
return null;
}
java.util.Map<Integer,Integer> map = new java.util.HashMap<>();
for(int i = 0;i < inorder.length;i++){
map.put(inorder[i],i);
}
return buildNode(preorder,0,preorder.length-1,inorder,0,inorder.length-1,map);
}
public TreeNode buildNode(int[] preorder,int begin1,int end1,
int[] inorder,int begin2,int end2,
java.util.Map<Integer,Integer> map){
if(begin1 > end1 || begin2 > end2){
return null;
}
if(begin1 == end1){
return new TreeNode(preorder[begin1]);
}
TreeNode root = new TreeNode(preorder[begin1]);
int index = map.get(preorder[begin1]);
root.left = buildNode(preorder,begin1+1,begin1+index-begin2,inorder,begin2,index-1,map);
root.right = buildNode(preorder,begin1+1+index-begin2,end1,inorder,index+1,end2,map);
return root;
}
}