您的位置:首页 > 其它

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

2017-07-30 00:35 197 查看

题目

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



思想:

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息