题目描述(传送门)
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
解题思路&代码实现
/**
* @ClassName leetcode106
* @Description :TODO
* @Author Josvin
* @Date 2021/03/31/11:09
*/
public class leetcode106 {
private int index = 0;
public TreeNode buildTree(int[] inorder, int[] postorder) {
index = postorder.length - 1;
return buildTreeHelper(inorder, postorder, 0, inorder.length);
}
private TreeNode buildTreeHelper(int[] inorder, int[] postorder, int inorderLeft, int inorderRight) {
if (inorderLeft >= inorderRight) {
return null;
}
if (index < 0) {
return null;
}
TreeNode newNode = new TreeNode(postorder[index]);
int pos = find(inorder, inorderLeft, inorderRight, newNode.val);
index--;
// 在这里注意先是 newNode 的右子树,下来才是左子树
newNode.right = buildTreeHelper(inorder, postorder, pos + 1, inorderRight);
newNode.left = buildTreeHelper(inorder, postorder, inorderLeft, pos);
return newNode;
}
private int find(int[] inorder, int inorderLeft, int inorderRight, int val) {
for (int i = inorderLeft; i < inorderRight; i++) {
if (inorder[i] == val) {
return i;
}
}
return -1;
}
}