LeetCode 103. 二叉树的锯齿形层次遍历

时间:2022-07-22
本文章向大家介绍LeetCode 103. 二叉树的锯齿形层次遍历,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

103. 二叉树的锯齿形层次遍历

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

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

    3
   / 
  9  20
    /  
   15   7

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

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

解题

首先这个题是在二叉树的层次遍历的基础上进行的。 可以看一下,我写的这个题解: LeetCode 102. 二叉树的层序遍历

这里就不在啰嗦层次遍历了。

如果你不懂二叉树的遍历可以看: 我是怎么一步一步调试出来二叉树的遍历(超精彩配图),二叉树遍历再也不用愁了

这个矩形的思路其实就是S形状的

我们可以给每一层都标上一个号。

那我们就从1开始

如果这个层是奇数说明是第一层 如果是偶数说明是第二层

然后层数+1

然后循环执行

当判断是奇数还是偶数的时候执行不同的操作。

如果是奇数,那就把数据使用尾插法插入的list,说白了就是追加数据

如果是偶数,那就吧数据使用头插法插入list

最终就实现了这个题

核心代码:

   static public List<List<Integer>> levelOrder(TreeNode root) {
       List<List<Integer>> lists = new ArrayList<>();

       if(root==null) return lists;

       TreeNode treeNode = root;

       LinkedList<TreeNode> queue = new LinkedList<>();
       queue.add(treeNode);


       int ceng = 1;//记录层次

        while(!queue.isEmpty()){

            List<Integer> list = new ArrayList<>();

            int n = queue.size();

            int index =0;

            while (n>index){

                //出栈
                TreeNode node = queue.pop();

                //说明是第一层 如果第二层是会ceng+1,说明切换到了第二层
                if(ceng%2!=0){

                    //追加数据,也就是尾插法
                    list.add(node.val);
                //说明是二层
                }else{

                    //头插法
                    list.add(0,node.val);
                }


                if(node.left!=null){
                    queue.add(node.left);
                }

                if(node.right!=null){
                    queue.add(node.right);
                }

                index++;
            }


            ceng++;//每一层结束都+1
            lists.add(list);
        }

        return lists;
    }

所有测试代码:

package tree.二叉树的锯齿形层次遍历;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

class Solution {

    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(1);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(3);
        TreeNode t4 = new TreeNode(4);
        TreeNode t5 = new TreeNode(5);
        t1.left=t2;
        t1.right=t3;
        t2.left=t4;
        t2.right=t5;


        System.out.println();
        System.out.println("层次遍历:");
        List<List<Integer>> lists = levelOrder(t1);

        System.out.println("结果:"+lists.toString());

        System.out.println("遍历结果:");

        lists.stream().forEach(li -> {

            li.stream().forEach(ll -> {
                System.out.print(ll.intValue()+" ");
            });

            System.out.println();

        });

    }

   static public List<List<Integer>> levelOrder(TreeNode root) {
       List<List<Integer>> lists = new ArrayList<>();

       if(root==null) return lists;

       TreeNode treeNode = root;

       LinkedList<TreeNode> queue = new LinkedList<>();
       queue.add(treeNode);


       int ceng = 1;//记录层次

        while(!queue.isEmpty()){

            List<Integer> list = new ArrayList<>();

            int n = queue.size();

            int index =0;

            while (n>index){

                //出栈
                TreeNode node = queue.pop();

                //说明是第一层 如果第二层是会ceng+1,说明切换到了第二层
                if(ceng%2!=0){

                    //追加数据,也就是尾插法
                    list.add(node.val);
                //说明是二层
                }else{

                    //头插法
                    list.add(0,node.val);
                }


                if(node.left!=null){
                    queue.add(node.left);
                }

                if(node.right!=null){
                    queue.add(node.right);
                }

                index++;
            }


            ceng++;//每一层结束都+1
            lists.add(list);
        }

        return lists;
    }
}

class TreeNode {
    int val;//每个节点存放的数据
    TreeNode left;//左节点
    TreeNode right;//右节点
    TreeNode(int x) { val = x; }
}