给出二叉树先序和中序数组,打印后序遍历结果-Java实现

给出二叉树先序和中序数组,打印后序遍历结果

给出二叉树样例:

/****************************************************************************
                  A                                    A
                /    \                              /     \
              B        C                          B         C
            /   \     /                         /   \     /   \
           D      E  F                         D     E   F     G
            \         \                             /   / \   /  \
             G          H                          H   I   J K    L
    先序:A-B-D-G-E-C-F-H                     A-B-D-E-H-C-F-I-J-G-K-L
    中序:D-G-B-E-A-F-H-C                     D-B-H-E-A-I-F-J-C-K-G-L
    后序:G-D-E-B-H-F-C-A                     D-H-E-B-I-J-F-K-L-G-C-A
    *************************************************************************/

题目分析:
先序遍历:根节点-左子树-右子树
中序遍历:左子树-根节点-右子树
由先序和中序数组可以确认二叉树左右子树;根据二叉树性质,二叉树的左右子树分别为二叉树;递归添加即可实现该二叉树。

以下为具体实现:

public class BinaryTreeQuestion{

    private static class TreeNode<E> {
        private E element;
        private TreeNode left,right;

        public TreeNode(E element) {
            this.element = element;
        }
    }
    // 生成二叉树
    private static TreeNode add(String[] argsPre,String[] argsIn){
        if(argsPre.length < 1) return null;
        if(argsPre.length == 1) return new TreeNode(argsPre[0]);
        TreeNode<String> node = new TreeNode<>(argsPre[0]);
        node.left = add(Arrays.copyOfRange(argsPre,1,rootIndex(argsPre,argsIn)+1),Arrays.copyOfRange(argsIn,0,rootIndex(argsPre,argsIn)));
        node.right = add(Arrays.copyOfRange(argsPre,rootIndex(argsPre,argsIn)+1,argsPre.length),Arrays.copyOfRange(argsIn,rootIndex(argsPre,argsIn)+1,argsIn.length));
        return node;
    }

    // 返回根节点下标
    private static int rootIndex(String[] args1,String[] args2){
        for (int i = 0; i < args2.length ; i++) {
            if(args1[0].equals(args2[i]))
                return i;
        }
        return 0;
    }

    // 后序遍历
    private static void afterOrder(TreeNode<String> root){
        if(root == null){
            return ;
        }
        afterOrder(root.left);
        afterOrder(root.right);
        System.out.print(root.element+"\t");
    }

    public static void main(String[] args) {
        String[] argsPre = {"A","B","D","G","E","C","F","H"};
        String[] argsIn = {"D","G","B","E","A","F","H","C"};
        String[] argsPre1 = {"A","B","D","E","H","C","F","I","J","G","K","L"};
        String[] argsIn1 = {"D","B","H","E","A","I","F","J","C","K","G","L"};
        System.out.println("预计结果:G-D-E-B-H-F-C-A");
        afterOrder(add(argsPre,argsIn));
        System.out.println();
        System.out.println("预计结果:D-H-E-B-I-J-F-K-L-G-C-A");
        afterOrder(add(argsPre1,argsIn1));
    }
}

测试结果:

预计结果:G-D-E-B-H-F-C-A
G	D	E	B	H	F	C	A	
预计结果:D-H-E-B-I-J-F-K-L-G-C-A
D	H	E	B	I	J	F	K	L	G	C	A	
Process finished with exit code 0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值