题目描述:
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
分析:
看到这道题是不是想到了根据前序遍历和中序遍历构造二叉树,没错前序遍历是先遍历根节点,再遍历左右子树;而后序遍历是先遍历左右子树再遍历根节点。
那么我们就可以根据之前那道题的做法,将后序遍历的结果从后向前依次构建每个根节点(因为后序是最后访问根节点的),然后再构造该节点的右子树,最后构造该节点的左子树。
代码:
class Solution {
//和前序+中序的顺序相反
public int postindex=0;
//构建树
//从后续遍历的最后一个元素开始,先构造根节点,再依次向前构造根节点的右子树、最后再构造根节点的左子树
public TreeNode buildTree(int[] inorder, int[] postorder,int inbegin,int inend) {
if(inbegin>inend)//没有节点了
{
return null;
}
TreeNode root=new TreeNode(postorder[postindex]);
//查找在中序结果种的位置
int inindex=-1;
for(int i=inbegin;i<=inend;i++)
{
if(inorder[i]==postorder[postindex])
{
inindex=i;
break;
}
}
if(inindex==-1)//表示没有找到
{
return null;
}
postindex--;
//构建根节点的右子树
root.right=buildTree(inorder,postorder,inbegin,inend);
//构建根节点的左子树
root.left=buildTree(inorder,postorder,inbegin,inend);
return root;
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(inorder==null || postorder==null || inorder.length==0 || postorder==0)
{
return null;
}
postindex=postorder.length-1;
return buildTree(inorder,postorder,0,inorder.length-1);
}
}