一、题目

从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行。

二、解题思路

用一个队列来保存将要打印的结点。为了把二叉树的每一行单独打印到一行里,我们需要两个变量:一个变量表示在当前的层中还没有打印的结点数,另一个变量表示下一层结点的数目。

三、解题代码

  1. public class Test {
  2. private static class BinaryTreeNode {
  3. private int val;
  4. private BinaryTreeNode left;
  5. private BinaryTreeNode right;
  6. public BinaryTreeNode() {
  7. }
  8. public BinaryTreeNode(int val) {
  9. this.val = val;
  10. }
  11. @Override
  12. public String toString() {
  13. return val + "";
  14. }
  15. }
  16. /**
  17. * 题目:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行。
  18. * @param root
  19. */
  20. public static void print(BinaryTreeNode root) {
  21. if (root == null) {
  22. return;
  23. }
  24. List<BinaryTreeNode> list = new LinkedList<>();
  25. BinaryTreeNode node;
  26. // 当前层的结点个数
  27. int current = 1;
  28. // 记录下一层的结点个数
  29. int next = 0;
  30. list.add(root);
  31. while (list.size() > 0) {
  32. node = list.remove(0);
  33. current--;
  34. System.out.printf("%-3d", node.val);
  35. if (node.left != null) {
  36. list.add(node.left);
  37. next++;
  38. }
  39. if (node.right != null) {
  40. list.add(node.right);
  41. next++;
  42. }
  43. if (current ==0) {
  44. System.out.println();
  45. current = next;
  46. next = 0;
  47. }
  48. }
  49. }
  50. }