image.png

    1. 代码实现:
    2. /*
    3. public class TreeNode {
    4. String value;
    5. TreeNode left;
    6. TreeNode right;
    7. TreeNode(String x) { value = x; }
    8. }
    9. */
    10. import java.util.HashMap;
    11. /**
    12. * @Author: deemoHui
    13. * @Description: 根据二叉树的先序遍历和中序遍历求后序遍历
    14. * @Date Created in 2020-09-07 10:50
    15. * @Modified By:
    16. */
    17. public class PreInToPost{
    18. public static void main(String[] args) {
    19. String[] preorder = new String[]{"A","D","C","E","F","G","H","B"};
    20. String[] inorder = new String[]{"C","D","F","E","G","H","A","B"};
    21. TreeNode root = new BuildTree().buildTree(preorder, inorder);
    22. System.out.print("后序遍历结果:");
    23. postOrder(root);
    24. }
    25. public static void postOrder(TreeNode node){
    26. if(node==null) {
    27. return;
    28. }
    29. postOrder(node.left);
    30. postOrder(node.right);
    31. System.out.print(node.value);
    32. }
    33. }
    34. class BuildTree {
    35. HashMap<String, Integer> map = new HashMap<>();
    36. String[] po;
    37. public TreeNode buildTree(String[] preorder, String[] inorder) {
    38. po = preorder;
    39. for(int i = 0; i < inorder.length; i++) {
    40. map.put(inorder[i], i);
    41. }
    42. return recur(0, 0, inorder.length - 1);
    43. }
    44. TreeNode recur(int pre_root, int in_left, int in_right) {
    45. if(in_left > in_right) {
    46. return null;
    47. }
    48. TreeNode root = new TreeNode(po[pre_root]);
    49. int i = map.get(po[pre_root]);
    50. root.left = recur(pre_root + 1, in_left, i - 1);
    51. root.right = recur(pre_root + i - in_left + 1, i + 1, in_right);
    52. return root;
    53. }
    54. }

    image.png
    更好的解释见:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/solution/mian-shi-ti-07-zhong-jian-er-cha-shu-di-gui-fa-qin/