题目:
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
解法1:递归
/**
* 思路:
* 1
* 2 3
* 4 5 6 7
*
* 中序:425 1 637
* 后序:452 673 1
*
* 根据中序遍历我们可以知道根节点的位置,以及根节点的左子树和右子树各有多少个节点:425 1 637
* 在知道左子树和右子树个数的情况下,我们就能在后序遍历中找到左子树和右子树的起点和终点
* 之后递归的设置左右子树
*/
public TreeNode buildTree(int[] inorder, int[] postorder) {
return recursive(inorder,0,inorder.length,postorder,0,postorder.length);
}
private TreeNode recursive(int[] inorder, int in_start, int in_end, int[] postorder, int p_start, int p_end) {
if (p_start==p_end)return null;
TreeNode root = new TreeNode(postorder[p_end - 1]);
int in_root_index=0;
for (int i=in_start;i<in_end;i++){
if (inorder[i]==root.val)in_root_index=i;
}
int leftNum=in_root_index-in_start;
//这要注意,p_end取值p_start+leftNum
root.left=recursive(inorder,in_start,in_root_index,postorder,p_start,leftNum+p_start);
root.right=recursive(inorder,in_root_index+1,in_end,postorder,leftNum+p_start,p_end-1);
return root;
}
时间复杂度:On^2
空间复杂度:O1