class Solution {
HashMap<Integer,Integer> in_map = new HashMap<>();
int[] post;
public TreeNode buildTree(int[] inorder, int[] postorder) {
for(int i = 0;i < inorder.length;i++) in_map.put(inorder[i],i);
post = postorder;
TreeNode root = build(0, inorder.length - 1, 0, post.length - 1);
return root;
}
/* 记录中序遍历和后序遍历的数组边界,函数内,后续的末尾为当前节点,他的左节点则在中序
数组中对应元素的左边数组中,所以用hashmap找到中序数组节点的下标,node.left对中序数组左边进行查找,同时那些元素也在
后序数组的最前面,因此后序数组的起点不变,长度与前序数组一样,node.right同理*/
public TreeNode build(int in_left, int in_right,int po_left,int po_right){
if(in_left > in_right || po_left > po_right) return null;
int root = post[po_right];
int in_root = in_map.get(root);
TreeNode node = new TreeNode(root);
node.left = build(in_left, in_root - 1, po_left, in_root - 1 - in_left + po_left);
node.right = build(in_root + 1, in_right, in_root - in_left + po_left, po_right - 1);
return node;
}
}
前序中序也同理
class Solution {
HashMap<Integer,Integer> in_map = new HashMap<>();
int[] pre;
public TreeNode buildTree(int[] preorder, int[] inorder) {
for(int i = 0;i < inorder.length;i++) in_map.put(inorder[i],i);
pre = preorder;
TreeNode root = build(0, inorder.length - 1, 0, pre.length - 1);
return root;
}
public TreeNode build(int in_left, int in_right,int pre_left,int pre_right){
if(in_left > in_right || pre_left > pre_right) return null;
int root = pre[pre_left];
int in_root = in_map.get(root);
TreeNode node = new TreeNode(root);
node.left = build(in_left, in_root - 1, pre_left + 1, pre_right - in_right + in_root);
node.right = build(in_root + 1, in_right, pre_right - in_right + in_root + 1, pre_right);
return node;
}
}