• 一、题目
  • 二、解题思路
  • 三、解题代码

    一、题目

    请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。

    二、解题思路

    按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶数层,则先保存右子结点再保存左子结点到第二个栈里。

    三、解题代码

    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. public static void print(BinaryTreeNode root) {
    17. if (root == null) {
    18. return;
    19. }
    20. List<BinaryTreeNode> current = new LinkedList<>();
    21. List<BinaryTreeNode> reverse = new LinkedList<>();
    22. int flag = 0;
    23. BinaryTreeNode node;
    24. current.add(root);
    25. while (current.size() > 0) {
    26. // 从最后一个开始取
    27. node = current.remove(current.size() - 1);
    28. System.out.printf("%-3d", node.val);
    29. // 当前是从左往右打印的,那就按从左往右入栈
    30. if (flag == 0) {
    31. if (node.left != null) {
    32. reverse.add(node.left);
    33. }
    34. if (node.right != null) {
    35. reverse.add(node.right);
    36. }
    37. }
    38. // 当前是从右往左打印的,那就按从右往左入栈
    39. else {
    40. if (node.right != null) {
    41. reverse.add(node.right);
    42. }
    43. if (node.left != null) {
    44. reverse.add(node.left);
    45. }
    46. }
    47. if (current.size() == 0) {
    48. flag = 1 - flag;
    49. List<BinaryTreeNode> tmp = current;
    50. current = reverse;
    51. reverse = tmp;
    52. System.out.println();
    53. }
    54. }
    55. }
    56. }