106. 从中序与后序遍历序列构造二叉树【中等】
106. 从中序与后序遍历序列构造二叉树【中等】
题目描述
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗二叉树 。
示例 1:
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
示例 2:
输入:inorder = [-1], postorder = [-1]
输出:[-1]
提示:
- 1 <= inorder.length <= 3000
- postorder.length == inorder.length
- -3000 <= inorder[i], postorder[i] <= 3000
- inorder 和 postorder 都由不同的值组成
- postorder 中每一个值都在 inorder 中
- inorder 保证是树的中序遍历
- postorder 保证是树的后序遍历
代码
递归方法
思路:类似前序遍历中序遍历推理树的思路。指路LCR 124.推理二叉树
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {Map<Integer,Integer> map = new HashMap<Integer,Integer>();for(int i = 0;i<inorder.length;i++){map.put(inorder[i],i);}return build(inorder,0,inorder.length-1,postorder,0,postorder.length-1,map);}public TreeNode build(int[] inorder,int L1,int R1,int[] postorder,int L2,int R2,Map<Integer,Integer> map){if(L1>R1 ||L2>R2){return null;}int num = postorder[R2];int index= map.get(num);int size =index-L1;TreeNode node = new TreeNode(num);node.left = build(inorder,L1,index-1,postorder,L2,L2+size-1,map);node.right = build(inorder,index+1,R1,postorder,L2+size,R2-1,map);return node;}
}