二叉树的遍历

目录

概念:

结构:

二叉树的遍历

1.先序遍历(根—左—右)

2.中序遍历(左—根—右)

3.后序遍历(左—右—根)

4.层序遍历

二叉树层序遍历求解最大宽度


概念:

        二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 。

特点:

  1. 每个结点只有两棵子树,分别为左子树和右子树;

  2. 二叉树的左右子树如果位置发生了改变,含义也会发生改变

常见的二叉树类型:

  1. 满二叉树:如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树 。

  2. 完全二叉树:深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树。

结构:

class Node {
     int value;
     Node left;		//左子树
     Node right;	//右子树

    public Node (int value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }

二叉树的遍历

1.先序遍历(根—左—右)

	//preorder
    public static void preorder (Node head) {
        if (head == null) {
            return;
        }
        System.out.print(head.value+" ");
        preorder(head.left);
        preorder(head.right);
    }

2.中序遍历(左—根—右)

   //inorder
    public static void inorder (Node head) {
        if (head == null) {
            return;
        }
        inorder(head.left);
        System.out.print(head.value+" ");
        inorder(head.right);
    }

3.后序遍历(左—右—根)

后序遍历是解决二叉树dp问题的常用手段,后面的文章会分享到。

    //postorder
    public static void postorder (Node head) {
        if (head == null) {
            return;
        }
        postorder(head.left);
        postorder(head.right);
        System.out.print(head.value+" ");
    }

4.层序遍历

用队列实现二叉树的层序遍历。

    //BFS Breadth Frist Search
    public static void BFS (Node head) {
        Queue<Node> queue = new LinkedList<>();
        queue.add(head);
        while (!queue.isEmpty()) {
            Node cur = queue.poll();
            if (cur.left!=null) {
                queue.add(cur.left);
            }
            if (cur.right!=null) {
                queue.add(cur.right);
            }
            System.out.print(cur.value+" ");
        }
    }

二叉树层序遍历求解最大宽度

        在层序遍历的过程中,用curEnd记录当前层的最后节点,同时用nextEnd记录下一层的最后节点。当队列弹出节点与curEnd指向节点相同时,结束当前层的统计,将nextEnd给到curEnd,继续下一层的统计,直到队列中节点数为空。

	//BFS Search max Breadth
    public static int maxBreadth (Node head) {
      	int max = 0;
        Queue<Node> queue = new LinkedList<>();
        queue.add(head);
        Node curEnd = head;
        Node nextEnd = null;
        int levelNodes = 0; //记录当前层节点个数
        while(!queue.isEmpty()) {
            Node cur = queue.poll();
            if(cur.left != null) {
                queue.add(cur.left);
                nextEnd = cur.left;
            }
            if(cur.right != null) {
                queue.add(cur.right);
                nextEnd = cur.right;
            }
            levelNodes++;
            if(cur == curEnd) {
                max = Math.max(max,levelNodes);
                curEnd = nextEnd;
                levelNodes = 0;
            }
        }
        return max;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superzheng__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值