根据前序遍历和中序遍历的结果确定后序遍历

原文链接:http://www.dubby.cn/detail.html?id=9058

已知前序遍历和中序遍历:
前序遍历: GDAFEMHZ
中序遍历: ADEFGHMZ
求:后序遍历

  1. 我们根据前序遍历可以找到第一个root节点;
  2. 然后这个根据中序遍历可以知道这个root节点在哪里;
  3. 如果root两边都有元素,说明这个root有左子树和右子树;
  4. 如果root只有左边有元素,说明这个root只有左子树;
  5. 如果root只有右边有元素,说明这个root只有右子树。
  6. 然后递归的处理,就可以从root节点往下,梳理出整个树的结构。
public static String[] getPostOrder1(String[] preOrder, String[] inOrder) {
    currentPreLeft = 0;
    TreeNode<String> root = generateTree(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);
    List<String> temp = new PostOrder<String>().travelWithRecursion(root);
    String[] result = new String[preOrder.length];
    return temp.toArray(result);
}

private static int currentPreLeft = 0;

private static TreeNode<String> generateTree(String[] preOrder, int preLeft, int preRight, String[] inOrder, int inLeft, int inRight) {
    TreeNode<String> root = new TreeNode<>();
    root.setValue(preOrder[preLeft]);
    currentPreLeft++;
    int rootIndex = indexAt(inOrder, root.getValue());
    if (rootIndex > inLeft && rootIndex < inRight) {
        //根节点有左右子节点
        root.setLeft(generateTree(preOrder, currentPreLeft, preRight, inOrder, inLeft, rootIndex - 1));
        root.setRight(generateTree(preOrder, currentPreLeft, preRight, inOrder, rootIndex + 1, inRight));
    } else if (rootIndex > inLeft) {
        //根节点只有左子节点
        root.setLeft(generateTree(preOrder, currentPreLeft, preRight, inOrder, inLeft, rootIndex - 1));
    } else if (rootIndex < inRight) {
        //根节点只有右子节点
        root.setRight(generateTree(preOrder, currentPreLeft, preRight, inOrder, rootIndex + 1, inRight));
    }
    return root;
}

测试代码:

public static void main(String[] args) {
    //前序遍历
    final String[] preOrder = {"G", "D", "A", "F", "E", "M", "H", "Z"};
    System.out.println("前序遍历:" + String.join(", ", preOrder));
    //中序遍历
    final String[] inOrder = {"A", "D", "E", "F", "G", "H", "M", "Z"};
    System.out.println("中序遍历:" + String.join(", ", inOrder));
    System.out.println("后序遍历:" + String.join(", ", getPostOrder1(preOrder, inOrder)));
}

测试结果:

前序遍历:G, D, A, F, E, M, H, Z
中序遍历:A, D, E, F, G, H, M, Z
后序遍历:A, E, F, D, H, Z, M, G

微信扫码关注订阅号,获取更多精彩内容

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值