面试题32:从上到下打印二叉树
题目一:不分行从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从做到右的顺序打印。例如下图的二叉树,则依次打印出 8 6 10 5 7 9 11。
思路:借助队列实现二叉树的层序遍历
代码实现:这里写复杂了,后面有时间再改(用T03的方法)
package Question32;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class T01 {
public static void main(String[] args) {
Node node8 = new Node(8);
Node node6 = new Node(6);
Node node10 = new Node(10);
Node node5 = new Node(5);
Node node7 = new Node(7);
Node node9 = new Node(9);
Node node11 = new Node(11);
node8.left = node6;
node8.right = node10;
node6.left = node5;
node6.right = node7;
node10.left = node9;
node10.right = node11;
System.out.println(solve(node8).length);
}
public static int[] solve(Node root) {
if(root == null) return null;
int[] arr = new int[1000];
int index = 0;
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()) {
arr[index++] = queue.peek().val;
Node cur = queue.poll();
if(cur.left != null) queue.add(cur.left);
if(cur.right != null) queue.add(cur.right);
}
return Arrays.copyOf(arr, index);
}
}
class Node {
int val;
Node left;
Node right;
public Node(int val) {
this.val = val;
}
}
题目2:分行从上到下打印二叉树
从上到下按层打印二叉树,同一层的节点按从做到右的顺序打印,每一层打印到第一行。例如,上图的二叉树应该打印如下内容:
8
6 10
5 7 9 11
思路:在上题的基础上,增加一个curLevelCount 和 nextLevelCount 变量分别记录本层和下层的节点数目。本层节点数用于判断什么时候到达了一层的末尾,并且在遍历过程中通过子节点的有无增加nextLevelCount。在到达一层的末尾并且开始访问下一层是,curLevelCount = nextLevelCount,nextLevelCount = 0;
代码实现:这里写复杂了,后面有时间再改(用T03的方法)
package Question32;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class T02 {
public static void main(String[] args) {
Node node8 = new Node(8);
Node node6 = new Node(6);
Node node10 = new Node(10);
Node node5 = new Node(5);
Node node7 = new Node(7);
Node node9 = new Node(9);
Node node11 = new Node(11);
node8.left = node6;
node8.right = node10;
node6.left = node5;
node6.right = node7;
node10.left = node9;
node10.right = node11;
System.out.println(solve(node8));
}
public static List<List<Integer>> solve(Node root) {
if(root == null) return new ArrayList<List<Integer>>();
Queue<Node> queue = new LinkedList<>();
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> curLevelNodes = new ArrayList<>();
int curLevelCount = 1, nextLevelCount = 0;
queue.add(root);
while(!queue.isEmpty()) {
Node curNode = queue.poll();
curLevelNodes.add(curNode.val);
curLevelCount--;
if(curNode.left != null) {
queue.add(curNode.left);
nextLevelCount++;
}
if(curNode.right != null) {
queue.add(curNode.right);
nextLevelCount++;
}
if(curLevelCount == 0) {
result.add(curLevelNodes);
curLevelNodes = new ArrayList<>();
curLevelCount = nextLevelCount;
nextLevelCount = 0;
}
}
return result;
}
}
题目三:之字形打印二叉树。
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三方再按照从左到右的顺序打印,其它行以此类推。
思路:定义一个方向即可
代码实现:
package Question32;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.List;
public class T03 {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(root == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean direction = false;
while(!queue.isEmpty()) {
List<Integer> tempList = new ArrayList<>();
int size = queue.size();
for(int i = 0; i < size; i++) {
TreeNode node = queue.poll();
tempList.add(node.val);
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
}
if(direction) Collections.reverse(tempList);
direction = !direction;
result.add(tempList);
}
return result;
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int x) {
val = x;
}
}