题解 | #删除链表的节点#
从中序与后序遍历序列构造二叉树
http://www.nowcoder.com/practice/ab8dde7f01f3440fbbb7993d2411a46b
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param inorder int整型一维数组 中序遍历序列
* @param postorder int整型一维数组 后序遍历序列
* @return TreeNode类
*/
/*分治重构求解。中序遍历的顺序为:左中右;后序遍历的顺序为:左右中。
因此后续遍历序列的最后一个元素为根节点,我们找到它在中序遍历中的位置,
就可以把中序遍历序列划分为左右两部分,分别为左右子树的中序遍历序列;
而根据中序遍历划分出来的左右子树的元素个数,我们又可以把后序遍历序列划分为左右两个部分。
然后两个序列的左右部分分别走相同的过程进行递归重构,构建出根节点的左子树和右子树。
*/
public TreeNode buildTree (int[] inorder, int[] postorder) {
// write code here
if(inorder.length!=postorder.length || inorder==null || postorder.length==0) return null;
//先找到根节点
int buildroot=postorder[postorder.length-1];
//构造树
TreeNode newTree=new TreeNode(buildroot);
//寻找中序遍历中的根节点所在位置
int index=0;
for(int i=0;i<inorder.length;i++){
if(inorder[i]==buildroot){
index=i;
break;
}
}
//重构
newTree.left=buildTree(Arrays.copyOfRange(inorder , 0 ,index) , Arrays.copyOfRange(postorder , 0 , index));
newTree.right=buildTree(Arrays.copyOfRange(inorder , index+1 , inorder.length),Arrays.copyOfRange(postorder ,index ,inorder.length-1));
return newTree;
}
}