二叉树&层次遍历

211 阅读2分钟

前言

“这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

介绍下二叉树层次遍历相关的问题

  1. NC15 求二叉树的层序遍历(中等)
  2. NC14 按之字形顺序打印二叉树(简单)

二叉树的层序遍历

描述:给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], [15,7] ]

思路分析: 使用队列,先把根节点加入到队列之中去, 当队列不为空时循环,

记录当前队列的节点数 size 即为当前层的节点数量, 当size 不为 0 时, 从队列中弹出节点,将val 加入到当前层的集合 temp 中, 然后 左子节点不为null 时将其加入队列, 右子节点做相同的操作

size 为 0 时 当前层遍历结束 将 temp 加入到最终的集合 ans 中

AC 代码:

    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        // write code here
        if(root == null) return new ArrayList<>();
        
        ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
        ArrayList<Integer> temp = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        
        while(!queue.isEmpty()){
            int size = queue.size();
            temp.clear();
            while(size-- != 0){
                TreeNode node = queue.poll();
                temp.add(node.val);
                if(node.left !=null){
                    queue.offer(node.left);
                }
                
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
            ans.add(new ArrayList<>(temp));
        }
        return ans;
    }

之字形顺序打印二叉树

描述: 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{1,2,3,#,#,4,5}

该二叉树之字形层序遍历的结果是 [ [1], [3,2], [4,5] ]

思路分析:

  • 奇数行从队列的尾部插入, 从头弹出节点, 偶数行 从队列的头部插入, 从尾部弹出节点
  • 按照层次遍历的方式写, 只不过在偶数行时 将 temp集合反转, 虽然也可以获取到正确的答案, 但注意它的遍历顺序不是之字形的, 所以不是很推荐这种解法,虽然可以AC

AC 代码:

    public ArrayList<ArrayList<Integer> > Print(TreeNode root) {
        if(root == null) return new ArrayList<>();
        ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
        ArrayList<Integer> temp = new ArrayList<>();
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        boolean leftToRight =true;
        while(!queue.isEmpty()){
            int size = queue.size();
            temp.clear();
            while(size-- != 0){
                TreeNode node ;
                if(leftToRight){
                    node = queue.pollFirst();
                    if(node.left != null){
                        queue.addLast(node.left);
                    }
                    if(node.right != null){
                        queue.addLast(node.right);
                    }
                }else{
                    node = queue.pollLast();
                   if(node.right != null){
                        queue.addFirst(node.right);
                    }
                    if(node.left != null){
                        queue.addFirst(node.left);
                    }
                }
                temp.add(node.val);
            }
            leftToRight = !leftToRight;
            ans.add(new ArrayList<>(temp));
        }
        return ans;
    }