二叉树的层次遍历
背景
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
如图:
输出:
A
B C
D E F G
H I J K
代码如下:
重点看levelOrder(TreeNode root)
方法
package com.david.learn.algorithm.tree;
import java.util.ArrayDeque;
import java.util.Queue;
// 二叉树的层次遍历
public class TreeDemo {
// 定义二叉树的节点
static class TreeNode {
// 节点存放的数据
public String data;
// 节点左孩子
public TreeNode left;
// 节点右孩子
public TreeNode right;
// 构造方法
public TreeNode(String data) {
this.data = data;
}
}
/**
* 初始化一颗二叉树
*
* @return
*/
public static TreeNode initTree() {
TreeNode root = new TreeNode("A");
TreeNode B = new TreeNode("B");
TreeNode C = new TreeNode("C");
TreeNode D = new TreeNode("D");
TreeNode E = new TreeNode("E");
TreeNode F = new TreeNode("F");
TreeNode G = new TreeNode("G");
TreeNode H = new TreeNode("H");
TreeNode I = new TreeNode("I");
TreeNode J = new TreeNode("J");
TreeNode K = new TreeNode("K");
root.left = B;
root.right = C;
B.left = D;
B.right = E;
D.left = H;
D.right = I;
E.right = J;
C.left = F;
C.right = G;
F.right = K;
return root;
}
/**
* 层次遍历二叉树
*
* @param root
*/
public static void levelOrder(TreeNode root) {
if (root != null) {
Queue<TreeNode> que = new ArrayDeque<>();
que.offer(root);
//int level = 1;
// 外层循环,队列为空说明已经遍历完所有元素
while (!que.isEmpty()) {
int levelNodeCount = que.size();
//System.out.println("第" + level + "层");
// for循环用于循环当前层的所有结点,count代表当前层次的结点数目
for (int i = 0; i < levelNodeCount; i++) {
// 从队列中弹出结点,且输出结点数据
TreeNode node = que.poll();
System.out.print(node.data + " ");
// 将该结点的左右孩子结点入队
if (node.left != null) {
que.offer(node.left);
}
if (node.right != null) {
que.offer(node.right);
}
}
//System.out.println();
//level++;
}
}
}
public static void main(String[] args) {
TreeNode root = initTree();
levelOrder(root);
}
}
拓展
如果要输出每一层的第一个或者每一层的最后一个呢?
每一层第一个:
A B D H
每一层最后一个:
A C G K
很简单,只要将System.out.print(node.data + " ");
这行改为
if (i == 0) {
System.out.print(node.data + " ");
}
或
if (i == levelNodeCount - 1) {
System.out.print(node.data + " ");
}