二叉树的锯齿形层序遍历

简介: 二叉树的锯齿形层序遍历

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

一、题目描述:

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

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]
示例 2:

输入:root = [1]
输出:[[1]]
示例 3:

输入:root = []
输出:[]

提示:

树中节点数目在范围 [0, 2000] 内
-100 <= Node.val <= 100

链接:https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal

二、思路分析:

1.遍历第二层的节点的顺序是从左到右,而输出第二层节点的顺序是从右到左,这正好满足栈思想,所有用栈来第二层所有节点。
2.遍历栈输出第二层节点,同时还需要将第三层的节点按照从右到左的顺序存储。但是不能将第三层的节点存储到这个栈中,因为会打乱第二层节点的顺序,此时我们可以想到创建另一个栈来存储第三层的元素。这样层与层之间就不会产生干扰。
3.交替使用这两个栈遍历所有的层。

三、AC 代码:

/**
 * 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>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        //栈1来存储右节点到左节点的顺序
        Stack<TreeNode> stack1 = new Stack<>(); 
        //栈2来存储左节点到右节点的顺序
        Stack<TreeNode> stack2 = new Stack<>();
        
        //根节点入栈
        stack1.push(root);
        
        //每次循环中,都是一个栈为空,一个栈不为空,结束的条件两个都为空
        while (!stack1.isEmpty() || !stack2.isEmpty()) {
            List<Integer> subList = new ArrayList<>(); // 存储这一个层的数据
            TreeNode cur = null;
            
            if (!stack1.isEmpty()) { //栈1不为空,则栈2此时为空,需要用栈2来存储从下一层从左到右的顺序
                while (!stack1.isEmpty()) {    //遍历栈1中所有元素,即当前层的所有元素
                    cur = stack1.pop();
                    subList.add(cur.val);    //存储当前层所有元素
                    
                    if (cur.left != null) {    //左节点不为空加入下一层
                        stack2.push(cur.left);
                    }
                    if (cur.right != null) {    //右节点不为空加入下一层
                        stack2.push(cur.right);
                    }
                }
                list.add(subList);
            }else {//栈2不为空,则栈1此时为空,需要用栈1来存储从下一层从右到左的顺序
                while (!stack2.isEmpty()) {
                    cur = stack2.pop();
                    subList.add(cur.val);
                    
                    if (cur.right != null) {//右节点不为空加入下一层
                        stack1.push(cur.right);
                    }
                    if (cur.left != null) { //左节点不为空加入下一层
                        stack1.push(cur.left);
                    }
                }
                list.add(subList);
            }
        }
        return list;
    }
}

四、总结:

image.png

相关文章
|
7月前
|
存储 算法 Java
二叉树层序遍历
二叉树层序遍历
55 0
|
7月前
|
算法
【二叉树】层序遍历
【二叉树】层序遍历
70 0
08_N叉树的层序遍历
08_N叉树的层序遍历
05_二叉树的层次遍历II
05_二叉树的层次遍历II
04_二叉树的层序遍历
04_二叉树的层序遍历
|
7月前
|
存储 算法 前端开发
589. N 叉树的前序遍历
589. N 叉树的前序遍历
34 0
|
7月前
|
算法 Java 程序员
【算法训练-二叉树 一】【遍历二叉树】前序遍历、中序遍历、后续遍历、层序遍历、锯齿形层序遍历、二叉树右视图
【算法训练-二叉树 一】【遍历二叉树】前序遍历、中序遍历、后续遍历、层序遍历、锯齿形层序遍历、二叉树右视图
69 0
|
算法
二叉树的层次遍历
层次遍历就是即逐层地,从左到右访问所有节点
二叉树的层次遍历