美文网首页
算法-32.3.从上到下打印二叉树 III

算法-32.3.从上到下打印二叉树 III

作者: zzq_nene | 来源:发表于2020-09-04 10:37 被阅读0次

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

    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }

方式一:借助辅助栈的方式

    public static List<List<Integer>> levelOrder3(TreeNode root) {
        if (root == null) {
            return null;
        }
        List<List<Integer>> list = new ArrayList<>();
        // 借助栈来保存每一行
        Stack<TreeNode> stack = new Stack<>();
        int lines = 0;
        stack.push(root);
        while (!stack.isEmpty()) {
            List<Integer> subList = new ArrayList<>();
            int count = stack.size();
            Stack<TreeNode> newStack = new Stack<>();
            while (!stack.isEmpty()) {
                newStack.push(stack.pop());
            }
            while (count > 0) {
                count--;
                // 这里如果使用一个栈,那么就会出现一个问题:
                // 即栈中原有两个元素,然后取出一个进行while循环
                // 此时又会加入两个,导致栈中原本想要的是剩下一个元素变成了3个元素
                TreeNode node = newStack.pop();
                if (node == null) {
                    continue;
                }
                subList.add(node.val);
                if (lines%2 == 0) {
                    stack.add(node.right);
                    stack.add(node.left);
                } else {
                    stack.add(node.left);
                    stack.add(node.right);
                }
            }
            lines++;
            if (subList.size() != 0)
                list.add(subList);
        }
        return list;
    }

方式二:借助队列以及List集合反转

    public List<List<Integer>> levelOrder4(TreeNode root) {
        if (root == null) {
            return null;
        }
        List<List<Integer>> list = new ArrayList<>();
        // 用于存储每一行的元素
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        boolean reverse = false;
        while (!queue.isEmpty()) {
            List<Integer> subList = new ArrayList<>();
            int count = queue.size();
            while (count > 0) {
                // 这个减1的操作不能放在最末尾,否则可能会因为当前节点是null导致没有减1
                count--;
                TreeNode node = queue.poll();
                if (node == null) {
                    continue;
                }
                subList.add(node.val);
                queue.offer(node.left);
                queue.offer(node.right);
            }
            // 借助Collections的reverse方法对List集合中的元素进行反转
            if (reverse) {
                Collections.reverse(subList);
            }
            if (subList.size() != 0) {
                list.add(subList);
            }
            reverse = !reverse;
        }
        return list;
    }

相关文章

网友评论

      本文标题:算法-32.3.从上到下打印二叉树 III

      本文链接:https://www.haomeiwen.com/subject/teggdktx.html