一.按层打印,从左到右分层打印
public static void level(Node node) {
if (node != null) {
Queue<Node> queue = new LinkedList<Node>();
queue.add(node);
while (!queue.isEmpty()) {
Node n=queue.poll();
System.out.print (n.val+" ");
if(n.leftChild!=null){
queue.add(n.leftChild);
}
if(n.rightChild!=null){
queue.add(n.rightChild);
}
}
}
}
二. 求二叉树最大的宽度(哪一次节点最多)
最重要的是找到每一次最右的那个节点,这样跟弹出的结点来比较,就能确定这一层已经遍历完成,一共有多少个节点了
public static int levelWidth(Node node) {
if (node == null) {
return 0;
}
Queue<Node> queue = new LinkedList<Node>();
queue.add(node);
int max = 0;
int currentLevelNodes = 0;//当前层的节点数
Node nextRightNode = null;//下一层最右节点
Node currentLevelRightNode = node;//当前层最右节点
while (!queue.isEmpty()) {
Node cur = queue.poll();
System.out.print(cur.val + " ");
if (cur.leftChild != null) {
queue.add(cur.leftChild);
nextRightNode = cur.leftChild;
}
if (cur.rightChild != null) {
queue.add(cur.rightChild);
nextRightNode = cur.rightChild;
}
currentLevelNodes++;
//当前弹出的结点如果是当前层最右的结点,
// 说明该层的所有结点都已经弹出,要遍历下一层了
if (cur == currentLevelRightNode) {
max = Math.max(max, currentLevelNodes);
currentLevelNodes = 0;
//设置下一层最右的结点(核心逻辑)
// 这样在遍历下一层时就知道最右的边界了
currentLevelRightNode = nextRightNode;
}
}
System.out.println();
return max;
}