剑指 Offer 32 - III. 从上到下打印二叉树 III

目录

使用函数实现

使用双端队列实现


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

例如:

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

复制代码
    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

复制代码
[
  [3],
  [20,9],
  [15,7]
]

提示:

  1. 节点总数 <= 1000

使用函数实现

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    List<List<Integer>> res=new ArrayList<>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        helper(root,0);
        return res;
    }

    private void helper(TreeNode root,int level){
        if(root==null)
            return;
        if(res.size()==level){
            res.add(new ArrayList<>());
        }
        if(level%2==0){
            res.get(level).add(root.val);

        }else{
            res.get(level).add(0,root.val);
        }
        helper(root.left,level+1);
        helper(root.right,level+1);
    }
}

使用双端队列实现

java 复制代码
/**
 * 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) {
        boolean isEven = false;//从1开始,第一行不是偶数
        if(root==null) return new ArrayList<>();
        List<List<Integer>>  ans = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(true){
            int size = queue.size();
            LinkedList<Integer> item = new LinkedList<>();
            for(int i=0;i<size;i++){
                root = queue.poll();
                if(!isEven) item.addLast(root.val);
                else item.addFirst(root.val);
                
                if(root.left!=null) queue.offer(root.left);
                if(root.right!=null) queue.offer(root.right);
            }
            isEven = !isEven;
            ans.add(item);
            if(queue.isEmpty()) break;
        }
        return ans;
    }
}
相关推荐
tt5555555555554 分钟前
字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
c++·算法·矩阵
元亓亓亓39 分钟前
LeetCode热题100--101. 对称二叉树--简单
算法·leetcode·职场和发展
躲在云朵里`43 分钟前
深入理解数据结构:从数组、链表到B树家族
数据结构·b树
不会学习?1 小时前
算法03 归并分治
算法
NuyoahC2 小时前
笔试——Day43
c++·算法·笔试
2301_821919922 小时前
决策树8.19
算法·决策树·机器学习
秋难降2 小时前
别再用暴力排序了!大小顶堆让「取极值」效率飙升至 O (log n)
python·算法·排序算法
学行库小秘3 小时前
基于门控循环单元的数据回归预测 GRU
人工智能·深度学习·神经网络·算法·回归·gru
_meow_3 小时前
数学建模 15 逻辑回归与随机森林
算法·数学建模·逻辑回归
1白天的黑夜14 小时前
链表-24.两两交换链表中的结点-力扣(LeetCode)
数据结构·leetcode·链表