题目
根据一棵树的前序遍历与中序遍历构造二叉树。
思路
递归思路参考官方视频讲解
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private Map<Integer, Integer> indexMap;
public TreeNode buildTree(int[] preorder, int[] inorder) {
int len = preorder.length;
indexMap = new HashMap<Integer, Integer>();
for(int i=0; i<len; i++){
indexMap.put(inorder[i],i);
}
return myBuildTree(preorder,0,len-1,inorder,0,len-1);
}
private TreeNode myBuildTree(int[] preorder, int preLeft, int preRight, int[] inorder, int inLeft, int inRight){
if(preLeft>preRight){
return null;
}
int preRoot = preLeft;
//找到中序遍历根节点
int inRoot = indexMap.get(preorder[preRoot]);
TreeNode root = new TreeNode(preorder[preRoot]);
//找到左序列的大小
int leftSize = inRoot-inLeft;
root.left=myBuildTree(preorder,preLeft+1,preLeft+leftSize,inorder,inLeft,inRoot-1);
root.right=myBuildTree(preorder,preLeft+leftSize+1,preRight,inorder,inRoot+1,inRight);
return root;
}
}
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)