解法一:递归
后序遍历序列末尾存储根结点,找出其在中序遍历中的位置,即可从源遍历序列中划分出左右子树的范围,递归建树。
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {return build(inorder, 0, inorder.length, postorder, 0, postorder.length);}private TreeNode build(final int[] inorder, int inBegin, int inEnd, final int[] postorder, int postBegin, int postEnd) {if ((inBegin >= inEnd) || (postBegin >= postEnd)) {return null;}// 后序遍历数组末尾为根结点int val = postorder[postEnd - 1];TreeNode root = new TreeNode(val);// 寻找中序遍历数组中根结点的位置int rootIndex = 0;for (int i = inBegin; i < inEnd; ++i) {if (inorder[i] == val) {rootIndex = i;break;}}int len = rootIndex - inBegin;// 划分左右子树的范围, 递归建树root.left = build(inorder, inBegin, rootIndex, postorder, postBegin, postBegin + len);root.right = build(inorder, rootIndex + 1, inEnd, postorder, postBegin + len, postEnd - 1);return root;}}
