106. Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree.
题目:给定一个树的中序排列和后续排列数组,重新绘制出该树
思路:由于后序的顺序的最后一个肯定是根,所以原二叉树的根节点可以知道,题目中给了一个很关键的条件就是树中没有相同元素,有了这个条件我们就可以在中序遍历中也定位出根节点的位置,并以根节点的位置将中序遍历拆分为左右两个部分,分别对其递归调用原函数。
1 2 private int getIndexInInorder(int[] inorder, int val) { 3 for (int i = 0; i < inorder.length; i++) if (val == inorder[i]) return i; 4 return -1; 5 } 6 7 private TreeNode buildPostAndIn(int[] postorder, int[] inorder, int postIndex, 8 int startInIndex, int endInIndex) { 9 if (endInIndex < startInIndex) return null; 10 TreeNode node = new TreeNode(postorder[postIndex]);//后续,最后一个节点一定是根节点 11 int index = getIndexInInorder(inorder,node.val); //获取该节点在中序数组中的位置,进一步结合startInIndex和endInIndex可以获得左右字树的范围 12 int lenL = index - startInIndex; 13 int lenR = endInIndex - index; 14 if (lenL > 0) node.left = buildPostAndIn(postorder, inorder, postIndex - lenR - 1, startInIndex, 15 index - 1); 16 if (lenR > 0) node.right = buildPostAndIn(postorder, inorder, postIndex - 1, 17 index + 1, endInIndex); 18 return node; 19 } 20 21 public TreeNode buildTree(int[] inorder, int[] postorder) { 22 if (postorder == null || postorder.length == 0) return null; 23 if (inorder == null || inorder.length == 0) return null; 24 if (postorder.length != inorder.length) return null; 25 return buildPostAndIn(postorder, inorder, postorder.length-1, 0, inorder.length - 1); 26 }