二叉树层次遍历
首先我们从最基础的打印二叉树开始!
层序遍历打印二叉树
public void printByLevel(Node head) {
if (head == null) {
return;
}
Queue<Node> queue = new LinkedList<>();
queue.offer(head);
while (!queue.isEmpty()) {
head = queue.poll();
System.out.print(head.value + " ");
if (head.left != null) {
queue.offer(head.left);
}
if (head.right != null) {
queue.offer(head.right);
}
}
System.out.println();
}
我们创建一个队列,依次将每一层的节点从左到右放入队列中,然后打印之。
二叉树的按层打印
题目:
思路:
根据层序遍历的规律,当我们遍历到当前层最后一个节点时,正好可以访问到下一层的最后一个节点。因此我们用两个节点记录当前层和下一层的最后一个节点。
代码:
public void printByLevel(Node head) {
if (head == null) {
return;
}
Queue<Node> queue = new LinkedList<>();
int level = 1;
Node last = head;
Node nLast = null;
queue.offer(head);
System.out.print("Level " + (level++) + " : ");
while (!queue.isEmpty()) {
head = queue.poll();
System.out.print(head.value + " ");
if (head.left != null) {
queue.offer(head.left);
nLast = head.left;
}
if (head.right != null) {
queue.offer(head.right);
nLast = head.right;
}
if (head == last && !queue.isEmpty()) {
System.out.print("\nLevel " +(level++) + " : ");
last = nLast;
}
}
System.out.println();
}
last记录当前层最后一个节点,nlast记录下一层最后一个节点。
层序遍历来序列化二叉树
题目:
序列化为字符串:
#!
为空节点。
思路:
层序遍历二叉树,通过字符串拼接即可。
代码:
/**
* 层序遍历来序列化
* @param head
* @return
*/
public String serialByLevel(Node head) {
if (head == null) {
return "#!";
}
String res = head.value + "!";
Queue<Node> queue = new LinkedList<>();
queue.offer(head);
while (!queue.isEmpty()) {
head = queue.poll();
if (head.left != null) {
res += head.left.value + "!";
queue.offer(head.left);
} else {
res += "#!";
}
if (head.right != null) {
res += head.right.value + "!";
queue.offer(head.right);
} else {
res += "#!";
}
}
return res;
}
题目2:
已知序列化后的字符串,反序列化出二叉树
思路:
遍历字符串,遍历同时生成节点,注意保留head节点,我们最后要返回头结点。
代码:
/**
* 反序列化--层遍历
* @param levelStr
* @return
*/
public Node reconByLevelString(String levelStr) {
String[] values = levelStr.split("!");
int index = 0;
Node head = generateNodeByString(values[index++]);
Queue<Node> queue = new LinkedList<>();
if (head != null) {
queue.offer(head);
}
Node node = null;
while (!queue.isEmpty()) {
node = queue.poll();
node.left = generateNodeByString(values[index++]);
node.right = generateNodeByString(values[index++]);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
return head;
}
private Node generateNodeByString(String val) {
if ("#".equals(val)) {
return null;
}
return new Node(Integer.parseInt(val));
}