题目:
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
题意:
给定一棵二叉树的中序和后序遍历,构建这颗二叉树。
注意:
你可以假定二叉树中不存在重复元素。
算法分析:
* 根据中序序列和后序序列构造二叉树,后序的最后一个结点一定是根结点,
* 该结点可以把中序序列分成左右两部分,对应于左右子树的中序序列,
* 根据左右两部分中结点的个数又可以把后序序列中除去最后一个结点的序列分成两部分,
* 对应于左右子树的后序序列,这样就可以递归构造左右子树。
AC代码:
<span style="font-family:Microsoft YaHei;font-size:12px;">/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution
{
public TreeNode buildTree(int[] inorder, int[] postorder)
{
if(inorder==null || postorder==null || inorder.length==0 || postorder.length==0)
return null;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
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,map);
}
private TreeNode helper(int[] inorder, int[] postorder, int inL, int inR, int postL, int postR, HashMap<Integer, Integer> map)
{
if(inL>inR || postL>postR)
return null;
TreeNode root = new TreeNode(postorder[postR]);
int index = map.get(root.val);
root.left = helper(inorder,postorder,inL,index-1,postL,postL+index-inL-1,map);
root.right = helper(inorder,postorder,index+1,inR,postR-(inR-index),postR-1,map);
return root;
}
}</span>