已知前序和中序遍历顺序,求后续遍历顺序

思路

前序遍历:根—>左孩子—>右孩子
中序遍历:左孩子—>根—>右孩子
后序遍历:左孩子—>右孩子—>根
所谓的前中后指的是根的位置,而左右孩子顺序是不变的。

例如已知前序遍历是DBACEGF,中序遍历是ABCDEFG,那么由前序遍历先根,可知道D是树的根,再看在中序遍历中D左边是ABC,所以可知道ABC一定在D的左子树上,而EFG在D的右子树上。
那么前序遍历为BAC,中序遍历为ABC,所以B为根,在中序遍历中A在B的左边,C在B的右边,所以A为B的左孩子,C为B的有孩子。

Code

import java.util.Scanner;

class Node
{
    public char value;
    public Node left;
    public Node right;

    public Node (char c)
    {
        this.value = c;
    }
}



public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner( System.in);
        while(scanner.hasNext())
        {
            String preOrder = scanner.nextLine();
            String midOrder = scanner.nextLine();

            Node root = regression(midOrder, preOrder);

            postOderPrint(root);
        }
    }

    private static Node regression(String midOrder, String preOrder) {
        if(midOrder.length() == 0 || preOrder.length() == 0)
        {
            return null;
        }

        final char r = preOrder.charAt(0);
        final String leftMid = midOrder.substring(0, midOrder.indexOf(r));
        final String rightMid = midOrder.substring(1 + midOrder.indexOf(r));
        final String leftHead = preOrder.substring(1, 1+leftMid.length());
        final String rightHead = preOrder.substring(1 + leftMid.length());

        final Node root = new Node(r);
        root.left = regression(leftMid,leftHead);
        root.right = regression(rightMid, rightHead);

        return root;
    }

    private static void postOderPrint(Node root) {
        if(root != null)
        {
            postOderPrint(root.left);
            postOderPrint(root.right);
            System.out.print(root.value);
        }
    }
}

测试用例

DBACEGF
ABCDEFG


ACBFGED

你可能感兴趣的:(剑指Offer)