根据中序和后序遍历结果构建二叉树
解题思路:递归调用,但需要注意的是先根据根节点建右树再建左树。
步骤:1)后序的最后一个节点肯定是树的根节点,取值建根节点,postIndex=postorder.length-1;
2)在中序中找该根节点值的位置,为inIndex
3)根据inIndex将中序分为左子树节点和右子树节点。
4)发现postIndex的前一位是树的右子树的节点。所以在建树的时候,我们要先建右树再建左树,postIndex--;
5)重复2)
public class Solution {
Map<Integer,Integer> inMap=new TreeMap<Integer,Integer>();
int postIndex=0;
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(inorder.length==0||postorder.length==0)return null;
postIndex=postorder.length-1;
for(int i=0;i<inorder.length;i++)
inMap.put(inorder[i],i);
return createTree(postorder,0,inorder.length-1);
}
TreeNode createTree(int[] postorder,int inStart,int inEnd)
{
if(inStart>inEnd ||postIndex<0)return null;
TreeNode root=new TreeNode(postorder[postIndex--]);
if(inStart==inEnd)return root;
int inIndex=inMap.get(root.val);
root.right=createTree(postorder,inIndex+1,inEnd);
root.left=createTree(postorder,inStart,inIndex-1);
return root;
}
}