LeetCode[106]从中序和后序遍历序列构造二叉树
思路:
我觉得这种题还是要找好边界,这道题和从中序和前序遍历序列构造二叉树差不多,就是后序遍历和前序遍历是反着来的,后序遍历最后一个是头节点,然后递归时中序遍历的处理逻辑没什么变化,唯一有变化的是后序遍历的递归逻辑,在后序遍历中确认左子树和右子树的范围,左子树范围是头节点---头节点+左子树长度-1,右子树范围头节点+左子树长度---尾节点-1。
代码:
/*** 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 {Map<Integer, Integer> map;public TreeNode buildTree(int[] inorder, int[] postorder) {map = new HashMap<>();for (int i = 0; i < inorder.length; i++) {map.put(inorder[i], i);}return helper(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);}public TreeNode helper(int[] inorder, int[] postorder, int i_start, int i_end, int p_start, int p_end) {if (p_start > p_end)return null;TreeNode root = new TreeNode(postorder[p_end]);int mid = map.get(postorder[p_end]);int leftLength = mid - i_start;root.left = helper(inorder, postorder, i_start, mid - 1, p_start, p_start + leftLength - 1);root.right = helper(inorder, postorder, mid + 1, i_end, p_start + leftLength, p_end - 1);return root;}
}