1.题目描述:
给定两个整数数组inorder和postorder,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请你构造并返回这颗二叉树。
2.拼凑的整体方法:
另外值得注意的是,前序和中序可以唯一确定一棵二叉树,后序和中序可以唯一确定一棵二叉树,前序和后序不能唯一确定一棵二叉树,因为没有中序遍历无法确定左右部分也就是无法分割。比如1的左节点2和1的右节点2,前序和后序都是一样的但却是两颗不同的树。
3.递归:
/**
* 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) {
return helper(inorder, 0, inorder.length, postorder, 0, postorder.length);//记住传入的left是索引,right是长度
}
public TreeNode helper(int[] inorder, int inleft, int inright, int[] postorder, int postleft, int postright) {
if(inleft == inright || postleft == postright) return null;
int last = postorder[postright - 1];//得到后序遍历末位用来切割中序遍历数组
int index = 0;
for (int i = inleft; i < inright; i++) {
if (last == inorder[i]) index = i;
}//也可以在主方法中将中序遍历的索引和值都存到哈希表中,每次只取就可以
TreeNode root = new TreeNode(last);
root.left = helper(inorder, inleft, index, postorder, postleft, postleft + (index - inleft));//递归处理左子树,在原数组上操作,形参很传递关键
root.right = helper(inorder, index + 1, inright, postorder, postleft + (index - inleft), postright - 1 );//递归处理右子树
return root;
}
}
4.迭代。。。待更新