剑指 offer 面试题 32 从上到下打印二叉树(按顺序、从左到右、按之字形打印)

从上到下打印二叉树

个人博客

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

题解
  • bfs(队列)

    • 算法思想
      • 利用队列,将树的元素从上到下,从左到右入队出队
    • 复杂度分析
      • 时间复杂度 O(n)
      • 空间复杂度 O(n):最差的情况下,树为平衡二叉树,此时最多有 n/2 个节点同时在队列中
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public int[] levelOrder(TreeNode root) {
            if(root == null)return new int[0];
            TreeNode node = null;
            ArrayList<Integer> list = new ArrayList<>(); 
            Queue<TreeNode> queue = new ArrayDeque<>();
            queue.add(root);
            while(queue.size() != 0){
                node = queue.poll();
                list.add(node.val);
                if(node.left != null)queue.add(node.left);
                if(node.right != null)queue.add(node.right);
            }
            int[] res = new int[list.size()];
            for(int i = 0; i< list.size();i++){
                res[i] = list.get(i);
            }
            return res;
        }
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vAizBo85-1596681445824)(/Users/apple/Library/Application Support/typora-user-images/image-20200806011736672.png)]

总结
  • 熟能生巧

从上到下打印二叉树(分层)

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

题解
  • bfs

    • 利用队列,进入每一层之前计算队列中元素的个数,然后将这些元素装入 list 中
    • 复杂度分析
      • 时间复杂度 O(n)
      • 空间复杂度 O(n):最差的情况下,树为平衡二叉树,此时最多有 n/2 个节点同时在队列中
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            TreeNode node = null;
            List<List<Integer>> list = new ArrayList<>(); 
            Queue<TreeNode> queue = new ArrayDeque<>();
            if(root != null)queue.add(root);
            while(queue.size() != 0){
                List<Integer> arr = new ArrayList<>();
                for(int i = queue.size();i>0;i--){
                    node = queue.poll();
                    arr.add(node.val);
                    if(node.left != null)queue.add(node.left);
                    if(node.right != null)queue.add(node.right);
                }
                list.add(arr);
            }
            return list;
        }
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XLbOsOF9-1596681445827)(/Users/apple/Library/Application Support/typora-user-images/image-20200806014031104.png)]

总结
  • 之前做过分层的题,但是今天再次做分层却无从下手,不知道如何确定元素在哪一层,看了人家的解答之后才恍然大悟,原来可以先统计队列中元素的个数,然后作为一层,进行出队,顺便将他们的子节点入队,直到个数减为 0

从上到下打印二叉树 III

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

题解
  • 两个栈(重点是先进后出的思想---->这意味着会在每一层都颠倒 顺序,即按照之字形)

    • 在奇数层,加入子节点的时候,按照从右到左加入
    • 在偶数层,按照从左到右加入
  • bfs

    • 算法思想
      • 利用双端队列,当 res 中元素为单数的时候,证明此时候到了偶数层,则使用 addFirst
      • 否则使用 add
    • 复杂度分析
      • 时间复杂度 O(n)
      • 空间复杂度 O(n):最差的情况下,树为平衡二叉树,此时最多有 n/2 个节点同时在队列中
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            TreeNode node = null;
            Queue<TreeNode> queue = new ArrayDeque<>();
            List<List<Integer>> res = new ArrayList<>();
            if(root != null)queue.add(root);
            while(!queue.isEmpty()){
                LinkedList<Integer> list = new LinkedList<>();
                for(int i = queue.size();i > 0;i--){
                    node = queue.poll();
                    if(res.size()%2 == 1)list.addFirst(node.val);
                    else list.add(node.val);
                    if(node.left != null)queue.add(node.left);
                    if(node.right != null)queue.add(node.right);
                } 
                res.add(list);
            }
            return res;
        }
    }
    

    WdZviw

总结
  • 注意我们出入栈的顺序还是一样的,只是我们的值进入 list 的书序改变了,事实上会不会有点作弊?其实可以使用两个栈来实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值