数据结构 - 二叉树的前序、中序、后续遍历

    二叉树的前序、中序、后续遍历是面试的高频,需要完全的理解,并且多加练习。前序遍历就是先打印自己,再递归左指针,再递归右指针;中序遍历就是先递归左指针,再打印自己,最后递归右指针;后序遍历先递归左指针,再递归右指针,最后打印自己。

    无论是前序遍历、中序遍历、还是后序遍历都需要将所有的节点全部访问一遍,所以时间复杂度都的 O(N)。

    整体过程如下图:

    代码实现如下:

/**
 *  二叉树的遍历
 *          A
 *         / \
 *       B     C
 *     /  \   / \
 *    D    E  F  G
 *    前序遍历打印: A -> B -> C -> D -> E -> F -> G
 *    中序遍历打印: D -> B -> E -> A -> F -> C -> G
 *    后序遍历打印: D -> E -> B -> F -> G -> C -> A
 *
 * @author kevin
 * @date 2021/3/5 16:35
 * @since 1.0.0
 */
public class BinaryTreeErgodic {

    public static void main(String[] args) {
        Node dNode = new Node("D");
        Node eNode = new Node("E");
        Node fNode = new Node("F");
        Node gNode = new Node("G");

        Node bNode = new Node("B", dNode, eNode);
        Node cNode = new Node("C", fNode, gNode);

        Node root = new Node("A", bNode, cNode);

        // 二叉树前序遍历结果为:A B D E C F G
        // 二叉树中序遍历结果为:D B E A F C G
        // 二叉树后序遍历结果为:D E B F G C A
        System.out.print("二叉树前序遍历结果为:");
        preOrder(root);
        System.out.println(" ");
        System.out.print("二叉树中序遍历结果为:");
        inOrder(root);
        System.out.println(" ");
        System.out.print("二叉树后序遍历结果为:");
        postOrder(root);
    }





    /**
     * 前序遍历打印二叉树,前序遍历顺序为:跟(自己)、左、右
     * @param root 二叉树根节点
     */
    public static void preOrder(Node root) {
        if (root == null) {
            return;
        }
        System.out.print(root.data + " ");
        if (root.left != null) {
            preOrder(root.left);
        }
        if (root.right != null) {
            preOrder(root.right);
        }
    }

    /**
     * 中序遍历打印二叉树,顺序为:左、根(自己)、右
     * @param root 二叉树根节点
     */
    public static void inOrder(Node root) {
        if (root == null) {
            return;
        }
        if (root.left != null) {
            inOrder(root.left);
        }
        System.out.print(root.data + " ");
        if (root.right != null) {
            inOrder(root.right);
        }
    }

    /**
     *  后序遍历打印二叉树,顺序为:左、右、根(自己)
     * @param root 二叉树的根节点
     */
    private static void postOrder(Node root) {
        if (root == null) {
            return;
        }
        if (root.left != null) {
            postOrder(root.left);
        }
        if (root.right != null) {
            postOrder(root.right);
        }
        System.out.print(root.data + " ");
    }
    
    

    /**
     * 二叉树结构
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Node {
        /** 存储节点的数据 */
        private String data;
        /** 左子节点 */
        private Node left;
        /** 右子节点 */
        private Node right;

        public Node(String data) {
            this.data = data;
        }
    }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值