给定两个整数数组 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
保证是树的后序遍历思路:这道题与leetcode105-从前序与中序遍历序列构造二叉树-CSDN博客 相似,可以用来测试这道题是否学会了
HashMap<Integer, Integer> Map = new HashMap<>(); public TreeNode buildTree(int[] inorder, int[] postorder) { int n = inorder.length; //使用Map储存中序遍历的节点和节点位置 for (int i = 0; i < n; i++) { Map.put(inorder[i], i); } //进行递归构建二叉树 TreeNode node = new TreeNode(); node = createTree(inorder, postorder, 0, n - 1, 0, n - 1); return node; } public TreeNode createTree(int[] inorder, int[] postorder, int postLeft, int postRight, int inLeft, int inRight) { //递归结束条件 if (postLeft > postRight) { return null; } int preroot = postorder[postRight];//获取根节点 int inorderIndex = Map.get(preroot);//获取根节点在中序遍历中的位置 TreeNode root = new TreeNode(preroot);//加入根节点 int numOfRight = inRight - inorderIndex;//右子树的个数 root.right = createTree(inorder, postorder, postRight - numOfRight, postRight - 1, inorderIndex + 1, inRight); root.left = createTree(inorder, postorder, postLeft, postRight - numOfRight - 1, inLeft, inorderIndex - 1); return root; }