思路:其实和根据前序遍历和中序遍历来构造二叉树是一样的思路,我们那道题首先确定的就是根节点,也就是说,根节点的位置是很重要的,我们需要知道根节点的位置在哪。前序遍历的特点就是:中左右;中序遍历的特点就是:左中右。我们可以看到,这两种遍历的前两个遍历都是中和左子树,我们就可以联想到,这两种遍历都是遍历一样的结点但是顺序不一样而已。我们从中找到根节点的位置,根据中序遍历,我们就知道了左右子树都是什么元素了。然后就顺藤摸瓜一直找下去就行了。
这里也是一样,后序遍历的特点就是:左右中;而中序遍历是:左中右。他们的后两个是一样的序列但是顺序不一样,我们从中找到根节点也就找到了左右子树在哪了。中序遍历中根节点的位置其实就是后序遍历右子树开始遍历的位置。
然后我们递归到左右子树再查找他们的根节点,然后以此类推。。。
本质上讲就是为了找根节点而已。
我们按照分冶并且递归的办法进行传递构造树即可。
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {TreeNode root=null;root=bianli(root,inorder,postorder);return root;}public TreeNode bianli(TreeNode t,int []a,int []b){if(a.length==0||b.length==0)return null;for(int i=0;i<a.length;i++){if(b[b.length-1]==a[i]){TreeNode tmp=new TreeNode(a[i]);t=tmp;int []a_l=Arrays.copyOfRange(a,0,i);int []a_r=Arrays.copyOfRange(a,i+1,a.length);int []b_l=Arrays.copyOfRange(b,0,i);int []b_r=Arrays.copyOfRange(b,i,b.length-1);t.left=bianli(t.left,a_l,b_l);t.right=bianli(t.right,a_r,b_r);}}return t;}
}