LEETCODE 103. Binary Tree Zigzag Level Order Traversal 解题思路分析

题目大意:

二叉树的锯齿形层次遍历

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树 [3,9,20,null,null,15,7],

3
   / \
  9  20
    /  \
   15   7

返回锯齿形层次遍历如下:

[
  [3],
  [20,9],
  [15,7]
]

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=103

解题思路分析:

之前文章多次讲过,二叉树问题多数情况下应该想到使用dfs或者bfs来解题。本题要求逐行打印,因此bfs相对来说更加适合。

利用bfs广度优先搜索遍历二叉树每一行,如果当前行是偶数行,则正序向返回结果插入数据,反之则逆序插入。bfs的部分完全是模板级别的代码,这里就不在多说了。

实现代码:

public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
// 返回结果
List<List<Integer>> res = new ArrayList<>();
// root为空,返回res
if(root==null) return res;
// bfs用的Queue
Queue<TreeNode> q = new LinkedList<>();
// 将root加入Queue
q.offer(root);
// 当前行数
int level=0;
// 以下为bfs常规代码
while(q.size()>0){
int size=q.size();
// 保存当前行所有节点
List list = new ArrayList<>();
// 逐行遍历二叉树
while(size>0){
// 取出当前节点
TreeNode n = q.poll();
size--;
// 如果是偶数行,正序插入
if(level%2==0) list.add(n.val);
// 奇数行,倒序插入
else list.add(0, n.val);
// 左节点不为空,将左节点加入Queue
if(n.left!=null)q.offer(n.left);
// 右节点不为空,将右节点加入Queue
if(n.right!=null)q.offer(n.right);
}
// 行数加一
level++;
// 将当前行加入返回结果
res.add(list);
}
return res;
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) { // 返回结果 List<List<Integer>> res = new ArrayList<>(); // root为空,返回res if(root==null) return res; // bfs用的Queue Queue<TreeNode> q = new LinkedList<>(); // 将root加入Queue q.offer(root); // 当前行数 int level=0; // 以下为bfs常规代码 while(q.size()>0){ int size=q.size(); // 保存当前行所有节点 List list = new ArrayList<>(); // 逐行遍历二叉树 while(size>0){ // 取出当前节点 TreeNode n = q.poll(); size--; // 如果是偶数行,正序插入 if(level%2==0) list.add(n.val); // 奇数行,倒序插入 else list.add(0, n.val); // 左节点不为空,将左节点加入Queue if(n.left!=null)q.offer(n.left); // 右节点不为空,将右节点加入Queue if(n.right!=null)q.offer(n.right); } // 行数加一 level++; // 将当前行加入返回结果 res.add(list); } return res; }
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
    // 返回结果
    List<List<Integer>> res = new ArrayList<>();
    // root为空,返回res
    if(root==null) return res;
    // bfs用的Queue
    Queue<TreeNode> q = new LinkedList<>();
    // 将root加入Queue
    q.offer(root);
    // 当前行数
    int level=0;
    // 以下为bfs常规代码
    while(q.size()>0){
        int size=q.size();
        // 保存当前行所有节点
        List list = new ArrayList<>();
        // 逐行遍历二叉树
        while(size>0){
            // 取出当前节点
            TreeNode n = q.poll();
            size--;
            // 如果是偶数行,正序插入
            if(level%2==0) list.add(n.val);
            // 奇数行,倒序插入
            else list.add(0, n.val);
            // 左节点不为空,将左节点加入Queue
            if(n.left!=null)q.offer(n.left);
            // 右节点不为空,将右节点加入Queue
            if(n.right!=null)q.offer(n.right);
        }
        // 行数加一
        level++;
        // 将当前行加入返回结果
        res.add(list);
    }
    return res;
}

本题解法执行时间为3ms。

Runtime: 3 ms, faster than 74.98% of Java online submissions for Binary Tree Zigzag Level Order Traversal.

Memory Usage: 43.3 MB, less than 5.77% of Java online submissions for Binary Tree Zigzag Level Order Traversal.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-103-binary-tree-zigzag-level-order-traversal-解题思路分析/
此条目发表在leetcode分类目录,贴了, , , 标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。