目录
从中序与后续遍历序列构造二叉树
描述
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:你可以假设树中没有重复的元素。
示例
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:3 / \ 9 20 / \ 15 7
方法:递归
我们可以根据中序遍历和后序遍历的特点来做这个题。
后序遍历数组的最后一个元素为根节点,然后可以在中序遍历数组中找这个根节点的位置,根节点左边的都是左子树的元素,根节点右边的都是右子树的元素,由此我们可以将中序数组和后序数组按左右子树分为两个数组,接着我们递归构造左右子树。
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
return reCur(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
}
public TreeNode reCur(int[] inorder,int inlow,int inhigh, int[] postorder,int postlow,int posthigh){
if (inlow>inhigh) return null;//如果越界,直接返回
int rootValue=postorder[posthigh];//根节点的值
TreeNode root=new TreeNode(rootValue);//构造根节点
int i;//指示根节点在中序遍历中的下标
for (i = inlow; i <= inhigh; i++) {
if (inorder[i]==rootValue) break;//找到根节点在中序遍历数组中的位置
}//此时根节点左边的都为左子树节点,右边的都为右子树节点
root.left=reCur(inorder,inlow,i-1,postorder,postlow,postlow+i-inlow-1);//递归构造左子树
root.right=reCur(inorder,i+1,inhigh,postorder,postlow+i-inlow,posthigh-1);//递归构造右子树
return root;
}
}