美文网首页
《剑指offer第二版》面试题32 题目三:之字形打印二叉树(j

《剑指offer第二版》面试题32 题目三:之字形打印二叉树(j

作者: castlet | 来源:发表于2020-04-12 12:27 被阅读0次

    题目描述

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

    解题思路:

    1. 定义一个辅助队列queue,一个辅助栈。
    2. 先将根节点入队。
    3. 得到当前队列的大小n,则n就为当前层的节点数量。
    4. 把队列的n个节点依次出队,
      1. 如果当前层为奇数层,则打印出相应节点。
      2. 如果当前层为偶数层,就将节点压入辅助栈,每个节点出队的时候,就将出队的节点的左右节点分别入队。等该层遍历完成后,再将辅助栈出栈,并打印。
      3. n个节点出队后,则该层遍历完成,打印换行符。

    代码

    void printFormTopToBottom2(TreeNode root){
        if (root == null) {
            return;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        Stack<TreeNode> stack = new Stack<>();
        queue.offer(root); // 根节点入队
        int depth = 1;
        while (!queue.isEmpty()) {
            // 打印当前一层的节点
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                // 从队里里拿出一个节点的时候,将这个节点的左右子树分别入队。
                TreeNode tmp = queue.poll();
                if (tmp.left != null) {
                    queue.offer(tmp.left);
                }
                if (tmp.right != null) {
                    queue.offer(tmp.right);
                }
                if ((depth % 2) == 0) {
                    // 偶数层需要从右到左打印,则先用辅助栈存储起来
                    stack.push(tmp);
                } else {
                    // 奇数层是用左到右打印,正常打印即可
                    System.out.print(tmp.value);
                }
            }
            while (!stack.isEmpty()) {
                // 打印偶数层的值
                System.out.print(stack.pop().value);
            }
            System.out.println(); // 换行
            depth ++;
        }
    }
    

    相关文章

      网友评论

          本文标题:《剑指offer第二版》面试题32 题目三:之字形打印二叉树(j

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