一、题目

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

二、解题思路

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

三、解题代码

  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. }