返回与给定的前序和后序遍历匹配的任何二叉树。
pre 和 post 遍历中的值是不同的正整数。
示例:
输入:pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
输出:[1,2,3,4,5,6,7]
提示:
1 <= pre.length == post.length <= 30
pre[] 和 post[] 都是 1, 2, ..., pre.length 的排列
每个输入保证至少有一个答案。如果有多个答案,可以返回其中一个。
思路:递归。对于前序遍历,我们往往能够确定当前子树的根,而在已知根的情况下,我们根据后序遍历序列可以知道以该根为子树的子树中的结点数,因此我们可以通过递归解决该题。
class Solution {
public TreeNode constructFromPrePost(int[] pre, int[] post) {
int n=pre.length;
if(n==0) return null;
TreeNode root=new TreeNode(pre[0]);
if(n==1) return root;
int index=0;
for(int i=0;i<n;i++)
if(post[i]==pre[1])
index=i+1;
root.left=constructFromPrePost(Arrays.copyOfRange(pre, 1, index+1),
Arrays.copyOfRange(post, 0, index));
root.right=constructFromPrePost(Arrays.copyOfRange(pre, index+1, n),
Arrays.copyOfRange(post, index, n-1));
return root;
}
}