N0.889
题目:给出二叉树的先序遍历和后序遍历的结果,求一组层次遍历的结果
别人思路:先序遍历 根左右;后序遍历 左右根
一般遇到二叉树的题都用递归求解。很明显,先序和后序复原的二叉树是不唯一,
我们只需要根据某种规律恢复可能的一种二叉树。
比如,可以根据先序遍历找到第一个子树的头结点,作为左子树。
(1)先序遍历序列的第一个元素一定是根节点.
(2)先序遍历序列的第二个元素是根节点的左子树的根节点.
(3)后序遍历序列的根节点临近的前一个节点是根节点的右子树的根节点.
class Solution {
public TreeNode constructFromPrePost(int[] pre, int[] post) {
TreeNode node = buildTree(pre, post, 0, pre.length-1) ;
return node ;
}
TreeNode buildTree(int[] pre, int[] post, int begin, int end){
if(begin>end){
return null ;
}
if(begin == end){
return new TreeNode(pre[begin]) ;
}
TreeNode root = new TreeNode(pre[begin]) ;
int eval = 0 ;
int pb = 0 ;
//在后序遍历的序列中,获取右子树的根,然后获取其在先序遍历的序列中索引位置
for(int i=0;i<pre.length;i++){
if(post[i] == pre[begin]){
if(i>0){
eval = post[i-1] ;
}
}
}
for(int i=0;i<pre.length;i++){
if(pre[i] == eval){
pb = i ;
}
}
root.left = buildTree(pre, post, begin+1, pb-1) ;
root.right = buildTree(pre, post, pb, end) ;
return root ;
}
}