算法记录:按层次输出二叉树的节点,按层次锯齿化输出二叉树的节点

156 阅读1分钟

1.LeetCode 102 题:按层次输出二叉树的节点

思路:按层次输出二叉树的节点则首先考虑使用广度优先遍历
    (1)提出问题:如何保证输出的集合为当前层的值
        解决:使用队列,队列的长度即为当前层的长度
    (2)提出问题:怎么保证依次往下遍历
        解决:基于前序遍历,先加入队列中Poll出的当前节点的值,然后再往左右节点进行遍历,并且将左右节点接入到队列中
        

代码实现:

public static List<List<Integer>> levelOrder(TreeNode root){
//结果集
List<List<Integer>> res = new LinkedList<>();
if(root==null) return res;
//创建队列存当前层的节点
Queue<TreeNode> queue = new LinkedList<>();
//首先加入头节点
queue.offer(root);

while(!queue.isEmpty()){
    //当前层的值
    List<Integer> path = new ArrayList<>();
    //队列的大小,代表当前层的节点数,一定要指定,要不然会导致,串层
    int size = queue.size();
    //判断条件从1开始,且必须等于size大小
    for(int i=1;i<=size;i++){
        //poll节点加入到当前层的集合中
        TreeNode node = queue.poll();
        path.add(node.val);
        //假设有左右节点则加入到队列中
        if(node.left!=null) queue.add(node.left);
        if(node.right!=null) queue.add(node.right);
    }

    res.add(path);
}
return res;
}

2.二叉树的锯齿形层序遍历:leetCode 103题

思路:对应上面的层序遍历,依旧使用广度优先遍历,因为涉及到转向的操作,所以可以使用栈和一个判断符号来控制添加的位置
(1)提出问题:第一层由左向右,第二层是由右向左,依次往下,如何控制转向?
    解决:通过栈Deque,假设从左往右则每次插入都是尾部插入,进行一个压栈,最后输出的即为正序
                       假设从右往左则每次插入从头部插入,进行一个压栈,最后输出为逆序
                       

代码实现:

public static List<List<Integer>> levelOrder(TreeNode root){

    List<List<Integer>> res = new LinkedList<>();
    if(root==null) return res;

    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    //添加的控制输出顺序的判断符号
    boolean isOrderLeft=true;

    while(!queue.isEmpty()){
        //用栈来控制添加的数值
        Deque<Integer> path = new LinkedList<>();
        int size = queue.size();
        for(int i=1;i<=size;i++){

            TreeNode node = queue.poll();

            if(isOrderLeft){
                path.offerLast(node.val);
            }else {
                path.offerFirst(node.val);
            }

            if(node.left!=null) queue.add(node.left);
            if(node.right!=null) queue.add(node.right);
        }
        
        //注意一层输出完之后需要进行变向
        isOrderLeft=!isOrderLeft;
        //因为使用栈存储,所以最终返回的结果需要由List处理
        res.add(new ArrayList<>(path));
    }
    return res;
}