按照层次遍历并打印二叉树

来源:互联网 发布:gentoo linux 编辑:程序博客网 时间:2024/05/17 02:00

题目

按照层次遍历二叉树,并且按照层次输出二叉的节点

image

思想:
1. 使用队列来存放每一层的元素
2. 使用两个指针,last和nlast,分别表示当前当前打印行的最右边的节点,nlast表示下一行最右边的节点。
3. 在循环开始,只是取队列的头元素,但是不移除它,然后输出后,判断其左孩子和右孩子是否存在,存在都加入队列中
4. 最后关键一步是,每个节点加入的时候,使nlast指向加入的节点。移除队列头节点(在一开始的时候,令last=root),然后判断last和移除的头结点是否相等,相等则换行,不相等则继续遍历。

package com.ahut.bitree;import java.util.ArrayDeque;import java.util.LinkedList;import java.util.Queue;public class PrintBiTree {    public static void main(String[] args) {        Node root = new Node(1);        Node first = new Node(2);        root.left = first;        Node firth = new Node(4);        first.left = firth;        Node three = new Node(3);        root.right = three;        Node five = new Node(5);        three.left = five;        Node six = new Node(6);        three.right = six;        Node seven = new Node(7);        five.left = seven;        Node eight = new Node(8);        five.right = eight;        levelVisit(root);    }    private static void levelVisit(Node root) {        Node last = root;        Node nlast = null;        Queue<Node> queue = new ArrayDeque<Node>();        queue.add(root);        while (!queue.isEmpty()) {            Node peek = queue.peek();            System.out.print(peek.data + " ");            if (peek.left != null) {                queue.add(peek.left);                nlast = peek.left;            }            if (peek.right != null) {                queue.add(peek.right);                nlast = peek.right;            }            Node poll = queue.poll();            if (poll.equals(last)) {                System.out.println();                last = nlast;            }        }    }}class Node {    public Node left;    public Node right;    int data;    public Node(int data) {        this.data = data;        left = null;        right = null;    }}