leetcode 103 二叉树的锯齿形层序遍历

47 阅读1分钟

这一道题是leetcode102的一道进阶题目,题目大意就是在奇数层进行从左到右的遍历,偶数层进行从右到左的遍历,该题有两种解法,跟leetcode102几乎如出一辙,可以使用dfs,也可以使用bfs。

1.BFS 广度优先遍历,使用队列进行储存每一层的结点,需要创建一个布尔值islefttoright 判断是否是从左到右,首先使用while循环进行判断树不为空的前提下,创建一个linkedlist(因为该集合在进行数据结构首部进行加入元素时,比数组所有元素往后挪一位更好)然后进行遍历quue当中的所有结点,判断islefttoright,如果为真那么就使用普通add方法加入到末尾,如果不是那么使用add(int index,int val)方法加入到数据结构首部,其次就是判断一下该结点是否有左右子节点,有的时候加入到队列中。最后就加入需要返回的res中即可。

  List<List<Integer>> res = new ArrayList<>();
    private Deque<TreeNode> queue = new ArrayDeque<>();
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        if (root == null) return res;
        queue.add(root);
//        代表是否从左到右进行遍历
        boolean isLeftToRight = true;
        while(!queue.isEmpty()){
            int length = queue.size();
            List<Integer> list = new LinkedList<>();
            for (int i = 0; i < length; i++) {
                TreeNode node = queue.removeFirst();
                if (isLeftToRight) list.add(node.val);
                else ((LinkedList<Integer>) list).addFirst(node.val);
                if (node.left != null) queue.add(node.left);
                if (node.right != null) queue.add(node.right);
            }
            res.add(list);
            isLeftToRight = !isLeftToRight;
        }
        return res;
    }

第二种方法就是使用dfs,实在是不想码字了,就说一下核心的地方吧,主要是使用递归时,使用一个count代表层数,每当重新进入一个递归时,需要加一。