一、需求
- 根据一棵树的中序遍历与后序遍历构造二叉树。
例如,给出
中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树:
3 / \ 9 20 / \ 15 7
注意:
你可以假设树中没有重复的元素。
二、递归法
2.1 思路分析
- 中序遍历的特点是"左根右",后序遍历的特点是"左右根",然后如何根据根节点来分别划分中序、后序数组呢?
- 找到根节点很容易,它是后序遍历中最后的元素,然后在中序遍历中确定根节点出现的索引,然后就能确定左子树的节点个数,各个边界也能随之确定;
2.2 代码实现
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
return buildTree(inorder, 0, inorder.length - 1, postorder, 0,
postorder.length - 1);
}
//该方法用来递归的根据前序与中序数组构造二叉树
private TreeNode buildTree(int[] inorder, int inStart, int inEnd,
int[] postorder, int poStart, int poEnd) {
if(inStart > inEnd) {
return null;
}
int rootVal = postorder[poEnd];
//确定根节点在中序遍历中的索引
int index = 0;
for(int i = inStart; i <= inEnd; i++) {
if(inorder[i] == rootVal) {
index = i;
break;
}
}
//确定左子树的节点数
int leftSize = index - inStart;
//构建二叉树
TreeNode root = new TreeNode(rootVal);
root.left = buildTree(inorder, inStart, index - 1, postorder,
poStart, poStart + leftSize - 1);
root.right = buildTree(inorder, index + 1, inEnd, postorder,
poStart + leftSize, poEnd - 1);
return root;
}
}
2.3 复杂度分析
- 时间复杂度为O(N);
- 空间复杂度为O(N);