当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

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

如二叉树:

  1. 1
  2. / \
  3. 2 3
  4. / \ / \
  5. 4 5 6 7

打印结果为:

  1. 1
  2. 3 2
  3. 4 5 6 7

解法

对于上述二叉树:

首先访问根结点,之后把2、3存入某结构。打印的时候,先打印3、2。这不就是栈?

依次弹出栈元素,分别是3、2。弹出时需要把3、2的子结点存入结构。由于访问时顺序是4 5 6 7。所以也需要用栈来存放。而且,此时需要先存放右孩子,再存放左孩子。(奇数层/偶数层存放左右孩子的顺序不同)

这里需要用两个栈来实现。如果只用一个栈,那么当弹出3、2 时,先将 3 的孩子节点压入栈。之后弹栈的时候不是先弹出 2,而是弹出了 3 的 孩子节点,就错了。

  1. import java.util.ArrayList;
  2. import java.util.Stack;
  3. /**
  4. * @author bingo
  5. * @since 2018/11/23
  6. */
  7. /*
  8. public class TreeNode {
  9. int val = 0;
  10. TreeNode left = null;
  11. TreeNode right = null;
  12. public TreeNode(int val) {
  13. this.val = val;
  14. }
  15. }
  16. */
  17. public class Solution {
  18. /**
  19. * 按之字形打印二叉树
  20. * @param pRoot 二叉树的根节点
  21. * @return 结果list
  22. */
  23. public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
  24. ArrayList<ArrayList<Integer>> res = new ArrayList<>();
  25. if (pRoot == null) {
  26. return res;
  27. }
  28. Stack<TreeNode> stack1 = new Stack<>();
  29. Stack<TreeNode> stack2 = new Stack<>();
  30. stack1.push(pRoot);
  31. int i = 1;
  32. Stack<TreeNode> stack = stack1;
  33. while (!stack.isEmpty()) {
  34. ArrayList<Integer> list = new ArrayList<>();
  35. while (!stack.isEmpty()) {
  36. TreeNode node = stack.pop();
  37. list.add(node.val);
  38. if (i % 2 == 1) {
  39. if (node.left != null) {
  40. stack2.push(node.left);
  41. }
  42. if (node.right != null) {
  43. stack2.push(node.right);
  44. }
  45. } else {
  46. if (node.right != null) {
  47. stack1.push(node.right);
  48. }
  49. if (node.left != null) {
  50. stack1.push(node.left);
  51. }
  52. }
  53. }
  54. res.add(list);
  55. ++i;
  56. stack = stack1.isEmpty() ? stack2 : stack1;
  57. }
  58. return res;
  59. }
  60. }

测试用例

  1. 功能测试(完全二叉树;所有节点只有左/右子树);
  2. 特殊输入测试(二叉树根节点为空指针;只有一个节点的二叉树)。

该分类下的相关小册推荐: