按層遍歷二叉樹並列印換行
阿新 • • 發佈:2018-12-14
package com.zyl.algorithm;
import java.util.LinkedList;
public class PrintBinaryTreeByFloor {
public static void main(String[] args) {
// 初始化一顆二叉樹
Node head = new Node(12);
head.left = new Node(34);
head.right = new Node(32);
head.left.left = new Node(1);
head.left.right = new Node(2);
head.right.right = new Node(3);
head.left.left.left = new Node(5);
head.left.left.right = new Node(6);
print(head);
}
/*
* 要求:
* 按層遍歷二叉樹,列印換行
* 思路:
* 使用兩個標記變數last和nlast,分別表示當前行的最後一個和下一行的最後一個,都初始化為head節點
* 使用佇列LinkedList,先放入head節點,之後每丟擲一個節點就把它不為空的孩子節點加入佇列
* 1.丟擲一個節點
* 2.如果其左右節點不為空則加入其孩子節點,沒加入一個節點,將其值賦值給nlast節點
* 3.如果丟擲的節點是last節點,說明一行列印完畢,需要換行.且現在的nlast節點是下一行的最右節點,將其賦值給last. 否則正常列印不換行
* 4.每加入一個節點就將其賦值給nlast,表示現有的最右節點
* 5.如果佇列不為空則繼續
*/
public static void print(Node head) {
LinkedList<Node> queue = new LinkedList<>();
Node last = head;
Node nlast = head;
queue.push(head);
while (queue.size() != 0) {
Node node = queue.removeFirst();
if (node.left != null) {
queue.add(node.left);
nlast = node.left;
}
if (node.right != null) {
queue.add(node.right);
nlast = node.right;
}
if (node.equals(last)) {
System.out.println(node.value);
last = nlast;
} else {
System.out.print(node.value + " ");
}
}
}
}
class Node {
int value;
Node left;
Node right;
public Node(int v) {
value = v;
}
}