法1:递归
Python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def constructFromPrePost(self, preorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
if len(preorder) == 0:
return None
elif len(preorder) == 1:
return TreeNode(preorder[0])
root_val = preorder[0]
left_root_val = preorder[1]
left_size = postorder.index(left_root_val) + 1
left = self.constructFromPrePost(preorder[1: 1+left_size], postorder[:left_size])
right = self.constructFromPrePost(preorder[1+left_size:], postorder[left_size: -1])
return TreeNode(root_val, left, right)
Java
class Solution {
public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {
return build(preorder, 0, preorder.length - 1, postorder, 0, postorder.length - 1);
}
public TreeNode build(int[] preorder, int preStart, int preEnd, int[] postorder, int postStart, int postEnd) {
if (preStart > preEnd) {
return null;
}
if (preStart == preEnd) {
return new TreeNode(preorder[preStart]);
}
TreeNode root = new TreeNode(preorder[preStart]);
int lastLeftInx = -1;
for (int i = postStart; i <= postEnd; ++i) {
if (postorder[i] == preorder[preStart + 1]) {
lastLeftInx = i;
break;
}
}
int leftSize = lastLeftInx - postStart + 1;
root.left = build(preorder, preStart + 1, preStart + leftSize, postorder, postStart, lastLeftInx);
root.right = build(preorder, preStart + leftSize + 1, preEnd, postorder, lastLeftInx + 1, postEnd - 1);
return root;
}
}